Java邮件之谜 - SMTP被阻止?

2022-09-04 23:41:56

我有一个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。

我已安装赛门铁克 (Norton) 360。关闭它没有任何区别,但是重新启动到安全模式(几乎禁用所有内容)可以使程序正常工作并发送邮件。

所以,回顾一下:

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

在我花了另一天时间拆开东西并卸载/重新安装之前,我想知道是否有人对解决这个问题有任何建议?


答案 1

这个问题是由于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
    

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


答案 2

在从java 1.6升级到java 1.7的过程中,我遇到了同样的问题。出现此问题的原因是 java 1.7 默认使用 IPv6。要解决此问题,您需要添加Java选项,如下面的示例所示。

只需在Windows cmd上运行以下命令:

setx _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true

推荐