Java Mail 之谜 - SMTP 被阻止?

Posted

技术标签:

【中文标题】Java Mail 之谜 - SMTP 被阻止?【英文标题】:Java Mail mystery - SMTP blocked? 【发布时间】:2012-12-13 09:36:14 【问题描述】:

我有一个使用 javax.mail 发送 SMTP 消息的 Java 程序。这个程序在 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。关闭它没有任何区别,但重新启动到安全模式(几乎禁用所有功能)允许程序正常工作并发送邮件。

所以,回顾一下:

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

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

【问题讨论】:

如果您在命令提示符下尝试telnet smtp.west.cox.net 25 会发生什么? 什么版本的 Windows? Windows 防火墙是否处于活动状态? 由于您的代码在安全模式下工作......这不是您的代码。我怀疑 Java 不允许通过 Windows 防火墙。 这个问题最好贴在ServerFault上。这是网络/操作系统问题,而不是编程问题。 测试端口 25 从 PUTTY (telnet) 连接到 SMTP 服务器。 【参考方案1】:

问题是由于 Java 的 IPv4/IPv6 首选项造成的。 Java 尝试默认使用 IPv6 (?) 而我的 ISP 不支持 IPV6。但是,默认情况下,它在我的 Windows 7 机器上启用。

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

IPv4 Connectivity:  Internet
IPv6 Connectivity:  No Internet access

这是问题的根源——Java 更喜欢 IPv6,它不能用来连接到 Internet。

要解决此问题,请执行以下其中一项(或两项)操作:

    在您的 Windows 7 机器上禁用 IPv6。

    使用此命令行选项启动您的 java 程序:

    -Djava.net.preferIPv4Stack=true
    

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

【讨论】:

感谢您的解释,解决了我的问题。 *** 上的其他人声称他们可以使用他们的邮件/Exchange 服务器的 IPv6 地址作为主机,而不是服务器的 IPv4 地址。但不确定是否能解决您上面提到的问题。 这真是一个非常棒的答案,我的头撞到了墙上!如果可以的话,我会给你 100 票。 只需传入 JVM 参数“-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

【讨论】:

星星有什么用?【参考方案3】:

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

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

修复 ID:3399185

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

请添加诸如cmets之类的简短答案【参考方案5】:

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

【讨论】:

【参考方案6】:

我遇到了类似的问题,但奇怪的是,一旦我安装了 jdk 1.7,一切都在 jdk 1.6 上正常工作,但我遇到了异常。我想知道这可能是什么原因!

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

【讨论】:

这相当于评论,而不是答案。

以上是关于Java Mail 之谜 - SMTP 被阻止?的主要内容,如果未能解决你的问题,请参考以下文章

java mail smtp port

Java Mail

Java Mail

java mail 发邮件连接不上smtp服务器怎么办

java 发送邮件

java通过smtp发送电子邮件