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", "me@mine.com")); 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。

在我再花一天时间分开并卸载/重新安装之前,我想知道是否有人有任何关于解决这个问题的建议?

问题是由于Java的IPv4 / IPv6偏好。 Java默认尝试使用IPv6(?),而我的ISP不支持IPV6。 但是,默认情况下,它在我的Windows 7盒子上启用。

如果您遇到类似的行为,可以通过转到“控制面板/网络和Internet /网络连接”,右键单击Internet连接,然后从上下文菜单中选择“状态”来validation这一点。 “状态”对话框将显示两行,类似于:

 IPv4 Connectivity: Internet IPv6 Connectivity: No Internet access 

这是问题的根源 – Java更喜欢IPv6,它不能用于连接到互联网。

要解决这个问题,请执行以下任一操作(或两者):

  1. 在Windows 7框上禁用IPv6。
  2. 使用以下命令行选项启动Java程序:

     -Djava.net.preferIPv4Stack=true 

执行其中任何一项都可以解决问题。

在从java 1.6升级到java 1.7期间,我遇到了同样的问题。 问题发生的原因是java 1.7默认使用IPv6。 要解决此问题,您需要添加Java Option,如下例所示。

只需在Windows cmd上运行此命令:

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

Synantec EP 12.1 RU5可以解决您的问题。

Symantec Endpoint Protection会阻止Java邮件客户端发送的电子邮件

修复ID:3399185

症状:Symantec Endpoint Protection的Internet电子邮件自动防护function会阻止Java邮件客户端发送的SMTP电子邮件。

解决方案:更新了Internet电子邮件自动防护驱动程序以允许处理IPv4映射的IPv6地址。

我也面临同样的问题,基本上它是一个Java 7问题,只是传入JVM参数“-Djava.net.preferIPv4Stack = true”,我摆脱了问题。

虽然这个问题已经解决了:指出一些Windows防火墙阻止/允许基于可执行文件名称(而不是纯粹的端口号本身)访问端口可能仍然有用 – 所以你最终可以使用一个程序(比如Outlook) )被允许而另一个(比如说Java)被阻止了。

我有类似的问题,但奇怪的是,一旦我安装jdk 1.7一切正常jdk 1.6我得到了例外。 我想知道这可能是什么原因!

添加IPV4参数后它工作正常。非常感谢你。