我正在使用JavaMail连接到POP3服务器。
此外,我设置了以下属性,因此如果电子邮件服务器没有响应,JavaMail将不会等待很长时间:
props.setProperty("mail.pop3.connectionpooltimeout", "3000");
props.setProperty("mail.pop3.connectiontimeout", "3000");
props.setProperty("mail.pop3.timeout", "3000");
但是,在某些情况下,超时工作正常,但有时JavaMail会冻结几分钟(!),并显示以下调试消息:
DEBUG POP3: connecting to host "pop3.yahoo.com", port 110, isSSL false
更改端口或协议(SSL,TLS ..)无效。我假设主机根本就不存在。
例如,如果我推测pop3.yahoo.com而不是pop.mail.yahoo.com(这将是正确的主机名),我必须等待很长时间才能超时超时发生。 几分钟后,我得到以下异常,应用程序继续运行:
java.net.ConnectException: Operation timed out
pop3.yahoo.com似乎存在,但不会回应:
localhost:~ me$ ping pop3.yahoo.com
PING pop3.yahoo.com (206.190.46.10): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
^C
您可能会问为什么我使用pop3.yahoo.com而不是pop.mail.yahoo.com。 好吧,我只想测试如果我的应用程序的用户插入了错误的主机名会发生什么。
我认为此问题与此报告有关http://www.opensubscriber.com/message/javamail-interest@java.sun.com/180946.html,其中海报声称如果电子邮件服务器关闭连接,则会出现问题。 JavaMail似乎等了很长时间(不知道为什么)。
由于我发布的链接中没有解决问题:有人知道如何解决或至少调试此问题吗?
任何帮助都非常感谢!
答案 0 :(得分:2)
我找到了问题的原因。这是我的代码中的一个错误。 Javamail尊重超时设置。
答案 1 :(得分:0)
最有可能的是,雅虎正在默默地丢弃针对该主机的所有数据包。这有点烦人,因为否则你会立即回到主机无法访问或拒绝连接,这将更容易处理。假设您使用的是POP3而不是POP3S,那么一切看起来都是正确的。
我从API中看到您可以提供自己的SocketFactory
。这样做可以更好地控制套接字参数,并且可以测试套接字是否真正由JavaMail正确创建(如果设置SocketFactory
属性不起作用,您知道该在哪里查看)。如果所有其他方法都失败了,您可以设置一个额外的线程来设置超时并在JavaMail线程到期时中断它。这当然是所有解决方法。
使用netstat检查连接处于什么状态也是有帮助的。如果它将超时,它应该在SYN_SENT中。