Java Mail之谜 - SMTP被阻止?

时间:2012-12-28 03:11:02

标签: java smtp javamail

我有一个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。
  4. 在我再花一天时间分开并卸载/重新安装之前,我想知道是否有人有任何关于解决这个问题的建议?

6 个答案:

答案 0 :(得分:51)

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

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

IPv4 Connectivity:  Internet
IPv6 Connectivity:  No Internet access

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

要解决此问题,请执行以下任一项(或两项):

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

    -Djava.net.preferIPv4Stack=true
    
  3. 执行其中任何一项都可以解决问题。

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:3)

Synantec EP 12.1 RU5解决了您的问题。

  

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

     

修正ID:3399185

     

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

     

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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