Java Mail之谜 - SMTP被阻止?

use*_*914 12 java smtp jakarta-mail

我有一个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
Run Code Online (Sandbox Code Playgroud)

这是代码:

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);
Run Code Online (Sandbox Code Playgroud)

这个程序几乎都使用默认值.它在同一网络上的另一个盒子上工作正常.它使用我用于常规邮件客户端的相同设置,工作正常.这个Windows框上有一些阻止SMTP的东西,但仅限于Java.

我安装了Symantec(Norton)360.关闭它没有任何区别,但重新启动到安全模式(几乎禁用所有内容)允许程序工作并发送邮件就好了.

所以,回顾一下:

  1. 程序代码有效.
  2. 设置是正确的.
  3. SMTP适用于Windows Mail,仅在此Windows计算机上阻止Java.

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

use*_*914 51

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

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

IPv4 Connectivity:  Internet
IPv6 Connectivity:  No Internet access
Run Code Online (Sandbox Code Playgroud)

这是问题的根源 - Java更喜欢IPv6,它无法用于连接到互联网.

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

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

    -Djava.net.preferIPv4Stack=true
    
    Run Code Online (Sandbox Code Playgroud)

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


小智 12

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

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

setx _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true
Run Code Online (Sandbox Code Playgroud)