Java发送邮件报错:Network is unreachable

使用javamail发送邮件时,老是提示Network is Network

1
2
3
4
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.163.com, 25; timeout -1;
  nested exception is:
    java.net.SocketException: Network is unreachable: connect
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2053)

于是ping了下,也telnet连了下,都没有问题,使用Outlook客户端配置该smtp地址也没有问题。由于之前使用过同样的代码和同样的配置发送成功过,所以代码应该没有问题的。找了好久,终于在*上找到了办法:为系统设置以下变量:

1
java.net.preferIPv4Stack=true

又顺便去官网上找了找这个变量的作用:

java.net.preferIPv4Stack (default: false)
If IPv6 is available on the operating system the underlying native socket will be, by default, an IPv6 socket which lets applications connect to, and accept connections from, both IPv4 and IPv6 hosts. However, in the case an application would rather use IPv4 only sockets, then this property can be set to true. The implication is that it will not be possible for the application to communicate with IPv6 only hosts.

大意是指:如果系统的IPv6可用的话,底层的Socket连接默认会使用IPv6的,因为它可以同时支持IPv4和IPv6的连接和被连接。如果应用只需要使用IPv4的socket连接,就把这个选项设置为true,这意味着该应用将不能与仅支持IPv6的机器通讯。

再看了看自己的机器上的IP:

Java发送邮件报错:Network is unreachable

果然是IPv6在作祟。

该选项可以通过以下命令在启动java时设置

1
java -Djava.net.preferIPv4Stack=true

也可以通过setProperty API来设置:

1
System.setProperty("java.net.preferIPv4Stack""true");

如果使用tomcat服务器,则可以给tomcat加上启动参数:

1
-Djava.net.preferIPv4Stack=true

如果在eclipse中使用tomcat,可以通过下图的方式配置:

Java发送邮件报错:Network is unreachable

之后的弹出框中切换到Argument标签,然后配置该变量:

Java发送邮件报错:Network is unreachable

之后问题解决。

上一篇:IOS上传文件开发


下一篇:第二十章:异步和文件I/O.(十)