2012-12-28 31 views
12

我有一個使用javax.mail發送SMTP消息的Java程序。這個程序在Linux上運行良好,我想事先強調一下。當我嘗試在我的Windows 7 x64系統中,這個相同的代碼,我得到這個錯誤:Java郵件神祕 - SMTP被阻止?

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。關閉它沒有任何區別,但重新啓動到安全模式(禁用幾乎所有內容)可以使程序正常工作併發送郵件。

因此,回顧一下:

  1. 程序代碼工作。
  2. 設置正確。
  3. SMTP適用於Windows Mail,並且僅在此Windows機器上被Java阻止。

在我花了一天把事情拆開並卸載/重新安裝之前,我想知道有沒有人有任何建議來解決這個問題?

+0

如果從命令提示符嘗試telnet smtp.west.cox.net 25',會發生什麼情況? –

+0

什麼版本的Windows? Windows防火牆是否活動? – Perception

+0

由於您的代碼在安全模式下工作...它不是你的代碼。我懷疑Java不允許通過Windows防火牆。 –

回答

49

問題是由於Java的IPv4/IPv6首選項。 Java嘗試默認使用IPv6(?),並且我的ISP不支持IPV6。但是,默認情況下,它已在我的Windows 7盒子上啓用。

如果您遇到類似行爲,可以通過轉到「控制面板/網絡和Internet /網絡連接」,右鍵單擊您的Internet連接並從上下文菜單中選擇「狀態」來驗證。狀態對話框將顯示類似這樣兩條線:

IPv4 Connectivity: Internet 
IPv6 Connectivity: No Internet access 

這是問題的根源 - 的Java喜歡的IPv6,它不能用來連接到互聯網。

爲了解決這個問題,做這些事情任何一個(或兩者):

  1. 禁用IPv6您的Windows 7盒。
  2. 使用此命令行選項啓動Java程序:

    -Djava.net.preferIPv4Stack=true 
    

做任何其中之一將解決這個問題。

+0

感謝您的解釋,修復我的問題。在stackoverflow上的其他人聲稱他們可以使用他們的郵件/ Exchange服務器的IPv6地址作爲主機而不是服務器的IPv4地址。但不確定是否解決了上述問題。 – armyofda12mnkeys

+0

這是一個真正的kickass答案,我把我的頭撞在牆上!如果可以的話,我會給你100票。 –

+0

@貝利斯 - 謝謝!我很高興能夠提供幫助。 :) – user1071914

11

我在將java 1.6升級到java 1.7時遇到了同樣的問題。 問題發生是因爲缺省情況下使用IPv6的java 1.7。 要解決此問題,您需要像下面的示例一樣添加Java選項。

在Windows CMD只要運行這個命令:

**setx _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true** 
+0

感謝它的魅力。 – Som

+0

明星是什麼? – azerafati

2

我也面臨着同樣的問題,基本上是一個Java 7的問題,只是在通過JVM參數「-Djava.net.preferIPv4Stack =真」 ,我擺脫了問題。

+0

請在評論中添加如此簡短的答案 – MichaC

0

我有類似的問題,但奇怪的是,一旦我安裝JDK 1.7,一切都工作正常與jdk 1.6我得到了異常。我想知道這可能是什麼原因!

添加IPV4參數後,它工作正常..非常感謝。

3

Synantec EP 12.1 RU5解決了您的問題。

Symantec Endpoint Protection blocks email sent by Java mail client

Fix ID: 3399185

Symptom: The Internet Email Auto-Protect feature of Symantec Endpoint Protection blocks SMTP email sent by a Java mail client.

Solution: Updated the Internet Email Auto-Protect driver to allow processing of IPv4-mapped IPv6 addresses.

1

雖然這個問題就解決了:它可能仍然是有用指出,某些Windows防火牆攔截/允許訪問基於可執行文件的名稱(而不是純粹的端口號本身)端口 - 這樣你就可以結束一個程序(比如Outlook)被允許,另一個(比如Java)被阻止。