我有一个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。关闭它没有任何区别,但重新启动到安全模式(几乎禁用所有内容)允许程序工作并发送邮件就好了。
所以,回顾一下:
在我再花一天时间分开并卸载/重新安装之前,我想知道是否有人有任何关于解决这个问题的建议?
答案 0 :(得分:51)
问题是由于Java的IPv4 / IPv6偏好。 Java默认尝试使用IPv6(?),我的ISP不支持IPV6。但是,默认情况下,它在我的Windows 7盒子上启用。
如果您遇到类似行为,可以通过转到“控制面板/网络和Internet /网络连接”,右键单击Internet连接,然后从上下文菜单中选择“状态”来验证这一点。 “状态”对话框将显示两行,类似于:
IPv4 Connectivity: Internet
IPv6 Connectivity: No Internet access
这是问题的根源 - Java更喜欢IPv6,它不能用于连接到互联网。
要解决此问题,请执行以下任一项(或两项):
使用以下命令行选项启动java程序:
-Djava.net.preferIPv4Stack=true
执行其中任何一项都可以解决问题。
答案 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参数后,它工作正常。非常感谢你。