ความลึกลับของ Java Mail - SMTP ถูกบล็อกหรือไม่

ฉันมีโปรแกรม Java ที่ใช้ javax.mail เพื่อส่งข้อความ SMTP โปรแกรมนี้ทำงานได้ดีบนกล่อง Linux ฉันอยากจะเน้นย้ำไว้ล่วงหน้า เมื่อฉันลองใช้รหัสเดียวกันนี้ในกล่อง Windows 7 x64 ของฉัน ฉันได้รับข้อผิดพลาดนี้:

send failed, exception: javax.mail.MessagingException: Could not connect to SMTP host:     smtp.west.cox.net, port: 25;
nested exception is:  java.net.SocketException: Network is unreachable: connect

นี่คือรหัส:

Session session = Session.getInstance(props, null);
MimeMessage msg = new MimeMessage(session);
msg.setFrom();
msg.setRecipients(Message.RecipientType.TO, props.getProperty("mail.to", "[email protected]"));
msg.setSubject(mySubject);
msg.setSentDate(new Date());
msg.setContent(sBuf.toString(), "text/html");
Transport.send(msg);

โปรแกรมนี้ใช้ค่าเริ่มต้นสำหรับทุกสิ่ง มันทำงานได้ดีในกล่องอื่นในเครือข่ายเดียวกัน มันใช้การตั้งค่าเดียวกันกับที่ฉันใช้กับโปรแกรมรับส่งเมลปกติซึ่งทำงานได้ดี มีบางอย่างในกล่อง Windows นี้ที่บล็อก SMTP แต่สำหรับ Java เท่านั้น

ฉันติดตั้ง Symantec (Norton) 360 แล้ว การปิดเครื่องไม่ได้สร้างความแตกต่าง แต่การรีบูตเครื่องใน Safe Mode (ซึ่งปิดใช้งานเกือบทุกอย่าง) ทำให้โปรแกรมทำงานและส่งจดหมายได้ดี

ดังนั้นขอสรุป:

  1. รหัสโปรแกรมทำงาน
  2. การตั้งค่าถูกต้อง
  3. SMTP ใช้งานได้กับ Windows Mail และถูกบล็อกสำหรับ Java บนเครื่อง Windows นี้เท่านั้น

ก่อนที่ฉันจะใช้เวลาอีกหนึ่งวันในการรื้อสิ่งต่าง ๆ และถอนการติดตั้ง / ติดตั้งใหม่ ฉันสงสัยว่ามีใครมีคำแนะนำในการแก้ไขปัญหานี้บ้างไหม


person user1071914    schedule 28.12.2012    source แหล่งที่มา
comment
จะเกิดอะไรขึ้นถ้าคุณลอง telnet smtp.west.cox.net 25 จากพรอมต์คำสั่ง   -  person Diego Basch    schedule 28.12.2012
comment
วินโดวส์เวอร์ชั่นอะไร? ไฟร์วอลล์ Windows ทำงานอยู่หรือไม่   -  person Perception    schedule 28.12.2012
comment
เนื่องจากรหัสของคุณทำงานในเซฟโหมด ... จึงไม่ใช่รหัสของคุณ ฉันสงสัยว่า Java ไม่อนุญาตผ่านไฟร์วอลล์ windows   -  person Brian Roach    schedule 28.12.2012
comment
คำถามนี้อาจโพสต์ใน ServerFault ได้ดีกว่า มันเป็นปัญหาเครือข่าย/ระบบปฏิบัติการ ไม่ใช่ปัญหาการเขียนโปรแกรม   -  person ccleve    schedule 28.12.2012
comment
การทดสอบพอร์ต 25 จาก PUTTY (telnet) เชื่อมต่อกับเซิร์ฟเวอร์ SMTP ตามที่ระบุ   -  person user1071914    schedule 28.12.2012
comment
@Perception: Windows คือ Windows 7 x64 ซึ่งมี Norton 360 Security Suite อยู่ ไฟร์วอลล์ของ Norton เข้ามาแทนที่ไฟร์วอลล์ Windows เป็นหลัก   -  person user1071914    schedule 28.12.2012
comment
ดูเหมือนจะไม่ใช่คำถามที่เกี่ยวข้องกับการเขียนโปรแกรมต่อตัว แต่คุณสามารถตรวจสอบได้ไหมว่า Java เองถูกบล็อกไม่ให้เข้าถึงอินเทอร์เน็ตหรือไม่?   -  person Pushkar    schedule 28.12.2012
comment
เพียงข้อเสนอแนะอย่าใช้ 25 เป็นพอร์ต smtp เพราะมันไม่ปลอดภัยและเมลเซิร์ฟเวอร์จำนวนมากจะตรวจจับเมลของคุณว่าเป็นสแปม   -  person ThePCWizard    schedule 28.12.2012


คำตอบ (6)


ปัญหาเกิดจากการตั้งค่า IPv4/IPv6 ของ Java Java พยายามใช้ IPv6 เป็นค่าเริ่มต้น (?) และ ISP ของฉันไม่รองรับ IPV6 อย่างไรก็ตาม มันถูกเปิดใช้งานบนกล่อง Windows 7 ของฉันตามค่าเริ่มต้น

หากคุณพบพฤติกรรมที่คล้ายกัน คุณสามารถตรวจสอบได้โดยไปที่ "แผงควบคุม/เครือข่ายและการเชื่อมต่ออินเทอร์เน็ต/เครือข่าย" คลิกขวาที่การเชื่อมต่ออินเทอร์เน็ตของคุณ และเลือก "สถานะ" จากเมนูบริบท กล่องโต้ตอบสถานะจะแสดงสองบรรทัดที่คล้ายกับสิ่งนี้:

IPv4 Connectivity:  Internet
IPv6 Connectivity:  No Internet access

นี่คือต้นตอของปัญหา - Java ชอบ IPv6 ซึ่งไม่สามารถใช้เชื่อมต่ออินเทอร์เน็ตได้

หากต้องการแก้ไขปัญหานี้ ให้ทำอย่างใดอย่างหนึ่ง (หรือทั้งสองอย่าง) ต่อไปนี้:

  1. ปิดการใช้งาน IPv6 บนกล่อง Windows 7 ของคุณ
  2. เริ่มโปรแกรมจาวาของคุณโดยใช้ตัวเลือกบรรทัดคำสั่งนี้:

    -Djava.net.preferIPv4Stack=true
    

การทำอย่างใดอย่างหนึ่งเหล่านี้จะช่วยแก้ไขปัญหาได้

person user1071914    schedule 28.12.2012
comment
ขอบคุณสำหรับคำอธิบายนี้ แก้ไขปัญหาของฉันแล้ว บุคคลอื่นใน stackoverflow อ้างว่าพวกเขาสามารถใช้ที่อยู่ IPv6 ของเซิร์ฟเวอร์อีเมล/Exchange เป็นโฮสต์แทนที่อยู่ IPv4 ของเซิร์ฟเวอร์ได้ แต่ไม่แน่ใจว่าจะแก้ปัญหาที่คุณกล่าวถึงข้างต้นได้ - person armyofda12mnkeys; 01.05.2013
comment
นี่เป็นคำตอบที่ไร้สาระจริงๆ ฉันเอาหัวโขกกำแพง! ฉันจะให้คุณ 100 โหวตถ้าทำได้ - person trognanders; 07.06.2013
comment
เพียงแค่ส่งผ่านอาร์กิวเมนต์ JVM -Djava.net.preferIPv4Stack=true ก็สามารถแก้ไขปัญหาของฉันได้ - person Gladwin Burboz; 20.09.2013

ฉันมีปัญหาเดียวกันระหว่างอัปเกรดแบบฟอร์ม java 1.6 เป็น java 1.7 ปัญหาเกิดขึ้นเนื่องจาก java 1.7 ใช้ IPv6 เป็นค่าเริ่มต้น เพื่อแก้ไขปัญหานี้ คุณต้องเพิ่มตัวเลือก Java ดังตัวอย่างด้านล่าง

เพียงรันคำสั่งนี้บน Windows cmd:

setx _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true
person mariusz117    schedule 09.08.2013
comment
ดวงดาวมีไว้เพื่ออะไร? - person azerafati; 02.03.2015

Synantec EP 12.1 RU5 แก้ไขปัญหาของคุณ

Symantec Endpoint Protection บล็อกอีเมลที่ส่งโดยไคลเอ็นต์เมล Java

รหัสแก้ไข: 3399185

อาการ: คุณลักษณะการป้องกันอีเมลทางอินเทอร์เน็ตอัตโนมัติของ Symantec Endpoint Protection จะบล็อกอีเมล SMTP ที่ส่งโดยไคลเอ็นต์เมล Java

วิธีแก้ไข: อัปเดตไดรเวอร์ป้องกันอีเมลทางอินเทอร์เน็ตอัตโนมัติเพื่อให้สามารถประมวลผลที่อยู่ IPv6 ที่แมป IPv4 ได้

person sengokyu    schedule 01.12.2014

ฉันก็ประสบปัญหาเดียวกัน โดยพื้นฐานแล้วมันเป็นปัญหา Java 7 เพียงแค่ส่งผ่านอาร์กิวเมนต์ JVM "-Djava.net.preferIPv4Stack=true" ฉันก็กำจัดปัญหาออกไปแล้ว

person sbpandey    schedule 02.10.2013
comment
โปรดเพิ่มคำตอบสั้น ๆ เช่นความคิดเห็น - person MichaC; 02.10.2013

แม้ว่าปัญหานี้จะได้รับการแก้ไขแล้ว แต่ก็ยังมีประโยชน์ที่จะชี้ให้เห็นว่าไฟร์วอลล์ Windows บางตัวบล็อก/อนุญาตการเข้าถึงพอร์ตตามชื่อที่ปฏิบัติการได้ (แทนที่จะใช้หมายเลขพอร์ตเพียงอย่างเดียว) ดังนั้นคุณจึงสามารถจบลงด้วยโปรแกรมเดียวได้ (เช่น Outlook ) ได้รับอนุญาตและอีกอัน (เช่น Java) ถูกบล็อก

person monojohnny    schedule 26.02.2015

ฉันมีปัญหาที่คล้ายกัน แต่น่าแปลกที่ทุกอย่างทำงานได้ดีกับ jdk 1.6 เมื่อฉันติดตั้ง jdk 1.7 ฉันได้รับข้อยกเว้น ฉันสงสัยว่าอะไรคือสาเหตุของสิ่งนี้!

หลังจากเพิ่มอาร์กิวเมนต์ IPV4 มันก็ทำงานได้ดี.. ขอบคุณมาก

person Renu    schedule 06.06.2014
comment
สิ่งนี้ถือเป็นความคิดเห็น ไม่ใช่คำตอบ - person Ojonugwa Jude Ochalifu; 13.08.2019