发送邮件:java.net.SocketException: Network is unreachable: connect。

12
尝试使用javax.mail发送邮件:
Properties props = new Properties();
props.put("mail.smtp.host", "xxxxx");
props.put("mail.smtp.port", "25");
props.put("mail.smtp.auth", "false");

Session session = Session.getInstance(props,
  new javax.mail.Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("xx", "xx");
    }
  });

try {
    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress("xxxxx"));
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("xxxxx"));
    message.setSubject("Subject");
    message.setText("Body");

    Transport.send(message);

    System.out.println("Done");

} catch (MessagingException e) {
    throw new RuntimeException(e);
}

它抛出异常

Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: srv-mail.imb.invention.com, port: 25;
  nested exception is:
        java.net.SocketException: Network is unreachable: connect
        at foo.SendMailTest.main(SendMailTest.java:41)
Caused by: javax.mail.MessagingException: Could not connect to SMTP host: xxx.xxxx.zzzzz.com, port: 25;
  nested exception is:
        java.net.SocketException: Network is unreachable: connect
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1961)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654)
        at javax.mail.Service.connect(Service.java:295)
        at javax.mail.Service.connect(Service.java:176)
        at javax.mail.Service.connect(Service.java:125)
        at javax.mail.Transport.send0(Transport.java:194)
        at javax.mail.Transport.send(Transport.java:124)
        at foo.SendMailTest.main(SendMailTest.java:36)
Caused by: java.net.SocketException: Network is unreachable: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:321)
        at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:237)
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1927)
        ... 7 more

服务器可用:

C:\work\test>nc.exe xxx 25
220 xxx.zzz.aaaaaaa.com Microsoft ESMTP MAIL Service ready at Thu, 12 Sep 2013 15:10:45 +0300

ping 命令也可以正常工作。

类似的 .net 代码也能按预期运行。

我不知道出了什么问题....


你是否在使用代理? - Anders R. Bystrup
1
我正在尝试通过 telnet 连接到您的电子邮件服务器的 25 和 587 端口(最常见的端口),但无法连接,但是 ping 功能正常。您确定它现在可以接受连接吗? - dic19
不,代理不存在。只有从我们的公司网络才能连接到此邮件服务器。不确定为什么它会发出ping请求。 - Sergey Azarkevich
这个问题似乎与Java无关,您应该首先尝试使用一个知名的邮件客户端(例如Thunderbird)进行连接,并首先排除服务器接受连接的问题。 - dendini
我已经将Outlook连接到了这个服务器。此外,我还有一些使用此服务器发送邮件(从我的计算机)的.NET工具。它们都能正常工作。:( 另外,我还有一个名为“blat”的程序,它也能够正确地通过该服务器发送邮件。 - Sergey Azarkevich
1个回答

37
答案是:Java偏好IPv6,但在我们公司中存在问题。 添加属性java.net.preferIPv4Stack=true解决了该问题。

太棒了...这帮助我找到了解决方案,因为我也突然遇到了Jenkins不发送电子邮件的相同错误。谢谢! - DomenicDatti

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