Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确设置JavaMail超时设置_Java_Jakarta Mail - Fatal编程技术网

如何正确设置JavaMail超时设置

如何正确设置JavaMail超时设置,java,jakarta-mail,Java,Jakarta Mail,我正在使用JavaMail连接到POP3服务器 此外,我还设置了以下属性,以便在电子邮件服务器不响应时,JavaMail不会等待太长时间: props.setProperty("mail.pop3.connectionpooltimeout", "3000"); props.setProperty("mail.pop3.connectiontimeout", "3000"); props.setProperty("mail.pop3.timeout", "3000"); localhost:~

我正在使用JavaMail连接到POP3服务器

此外,我还设置了以下属性,以便在电子邮件服务器不响应时,JavaMail不会等待太长时间:

props.setProperty("mail.pop3.connectionpooltimeout", "3000");
props.setProperty("mail.pop3.connectiontimeout", "3000");
props.setProperty("mail.pop3.timeout", "3000");
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
但是,在某些情况下,超时工作正常,但有时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似乎存在,但不会回应:

props.setProperty("mail.pop3.connectionpooltimeout", "3000");
props.setProperty("mail.pop3.connectiontimeout", "3000");
props.setProperty("mail.pop3.timeout", "3000");
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。 嗯,我只是想测试如果应用程序的用户插入错误的主机名会发生什么

我相信这个问题与这份报告有关,海报声称如果电子邮件服务器关闭连接,问题就会出现。JavaMail似乎等待了很长时间(不知道为什么)

由于这个问题在我发布的链接中没有得到解决:有人知道如何修复或至少调试它吗


任何帮助都将不胜感激

最有可能的情况是,雅虎正在悄悄地丢弃所有指向该主机的数据包。这有点烦人,因为否则您会立即返回主机无法访问或连接被拒绝,这将更容易处理。假设您使用的是POP3而不是POP3,那么一切看起来都是正确的

我从API中看到,您可以提供自己的
SocketFactory
。这样做可以更好地控制套接字参数,并且可以测试JavaMail是否真的正确创建了套接字(如果设置
SocketFactory
属性不起作用,那么您知道应该在哪里查找)。如果所有这些都失败了,您可以设置一个额外的线程来设置超时,并在JavaMail线程过期时中断它。当然,这些都是解决办法


向netstat检查连接处于什么状态也会很有帮助。如果要超时,它应该在SYN_SENT中。

我找到了问题的原因。这是我代码中的一个bug。Javamail很尊重超时设置。

如果yahoo真的以静默方式丢弃所有数据包,为什么Javamail不尊重我在属性对象中提供的超时设置?这真的很奇怪。@valmar是的,它看起来有点像JavaMail中的一个bug,但是如果没有额外的调试,就没有真正的方法来确定。