Java邮件之谜- SMTP被阻止了吗?

12

我有一个使用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。关闭它没有任何效果,但重新启动到安全模式(禁用几乎所有内容)允许程序正常工作并发送邮件。

因此,回顾一下:

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

在我再花费一天时间拆卸和卸载/重新安装之前,我想知道是否有人有修复此问题的建议?


如果您尝试从命令提示符中输入“telnet smtp.west.cox.net 25”,会发生什么? - Diego Basch
Windows 的哪个版本?Windows 防火墙是否已启用? - Perception
由于您的代码在安全模式下运行...这不是您的代码的问题。我怀疑Java被Windows防火墙禁止了。 - Brian Roach
4
这个问题最好在ServerFault上发布。这是一个网络/操作系统问题,而不是编程问题。 - ccleve
这似乎并不是一个与编程直接相关的问题。但是你可以检查一下是否阻止了Java访问互联网? - Pushkar
显示剩余3条评论
6个回答

51

问题是由于Java的IPv4/IPv6偏好引起的。 Java默认尝试使用IPv6,而我的ISP不支持IPv6。但是,在我的Windows 7桌面上,默认启用了IPv6。

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

IPv4 Connectivity:  Internet
IPv6 Connectivity:  No Internet access

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

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

  1. 在您的 Windows 7 计算机上禁用 IPv6。
  2. 使用以下命令行选项启动您的 Java 程序:

    -Djava.net.preferIPv4Stack=true
    

进行其中任意一个操作,都可以解决问题。


谢谢你的解释,解决了我的问题。Stackoverflow上有人声称他们可以使用邮件/Exchange服务器的IPv6地址作为主机,而不是服务器的IPv4地址。但我不确定这是否能解决你上面提到的问题。 - armyofda12mnkeys
1
这是一个非常棒的答案,我曾经为此苦思冥想!如果可以的话,我会给你100个赞。 - le3th4x0rbot
只需传入JVM参数“-Djava.net.preferIPv4Stack=true”,问题就得到了解决。 - Gladwin Burboz

12

在将Java 1.6升级为Java 1.7过程中,我遇到了同样的问题。这个问题是因为Java 1.7默认使用IPv6所致。为了解决这个问题,你需要像下面的示例一样添加Java选项。

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

setx _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true

星号有什么作用? - azerafati

3

Symantec EP 12.1 RU5可以解决您的问题。

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

修复ID:3399185

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

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


2

我之前也遇到了同样的问题,基本上是由于Java 7引起的。只需要在JVM参数中添加"-Djava.net.preferIPv4Stack=true",就可以解决这个问题。


请添加短回答作为注释// This function calculates the sum of two numbers // 这个函数计算两个数字的和 function addNumbers(num1, num2) { return num1 + num2; }// This function checks if a number is even or odd // 这个函数检查一个数字是偶数还是奇数 function checkEvenOrOdd(num) { if (num % 2 === 0) { return "Even"; } else { return "Odd"; } }// This function sorts an array in ascending order // 这个函数按升序对数组进行排序 function sortArray(arr) { return arr.sort(function(a, b) { return a - b; }); } - MichaC

1
尽管此问题已得到解决:仍有必要指出,某些Windows防火墙根据可执行文件名(而非纯粹的端口号)来阻止/允许对端口的访问 - 因此您可能会发现一个程序(例如Outlook)被允许,而另一个程序(例如Java)被阻止。

-1

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

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


这是一条注释,而不是答案。 - Ojonugwa Jude Ochalifu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接