为什么JavaMail连接超时太长
在我的应用程序中,我连接到服务器以验证用户。这是代码:为什么JavaMail连接超时太长,java,jakarta-mail,connection-timeout,Java,Jakarta Mail,Connection Timeout,在我的应用程序中,我连接到服务器以验证用户。这是代码: try { Properties prop = new Properties(); prop.put("mail.smtp.starttls.enable","true"); prop.put("mail.smtp.auth", "true"); prop.put("mail.smtp.connectiontimeout", 1000); Session s
try {
Properties prop = new Properties();
prop.put("mail.smtp.starttls.enable","true");
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.connectiontimeout", 1000);
Session session = Session.getInstance(prop, null);
Transport transport = session.getTransport("smtp");
transport.connect("mion.elka.pw.edu.pl", 587, registerLog, registerPass);
transport.close();
return true;
} catch (NoSuchProviderException ex) {
Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
return false;
} catch(AuthenticationFailedException ex) {
Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
return false;
} catch (MessagingException ex) {
Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
我将连接超时设置为1000ms=1s,但它是忽略的。当我调试并设置错误的用户名和密码时,我发现
javax.mail.MessagingException: java.net.SocketTimeoutException: Read timed out
不是在1000毫秒之后,而是在5000*60毫秒=5分钟之后
怎么了?如何减少超时?能否设置套接字i/O超时。当它已连接但无法从服务器读取数据时,它将继续等待
prop.put("mail.smtp.timeout", 1000);
读取超时表示您已连接,但无法从服务器读取数据。我通过更改为最新版本的JavaMail(到JavaMail 1.5)来解决问题。我在那里写到:
谢谢大家的帮助,特别是比尔·香农:)不,这只是因为值必须是字符串“1000”,而不是整数1000我遇到了同样的问题。它使用字符串而不是整数
prop.put("mail.smtp.timeout", "1000");
prop.put("mail.smtp.connectiontimeout", "1000");
由于您使用的是SSL,因此可以尝试配置
smtps
命名空间,而不是smtp
:
prop.put("mail.smtps.timeout", 1000);
prop.put("mail.smtps.connectiontimeout", 1000);
顺便说一句:属性中的超时值可以作为
int
以及String
传递。JavaMail将正确处理这两个问题(至少v1.5+)。mail.smtp.connectiontimeout类型:int
描述:套接字连接超时值(毫秒)。此超时由java.net.Socket实现。默认值为无限超时 mail.smtp.timeout 类型:int
描述:套接字读取超时值(毫秒)。此超时由java.net.Socket实现。默认值为无限超时 mail.smtp.writetimeout 类型:int
Desc:套接字写入超时值(毫秒)。此超时通过每个连接使用java.util.concurrent.ScheduledExecutorService来实现,该连接在超时过期时调度线程关闭套接字。因此,使用此超时的开销是每个连接一个线程。默认值为无限超时。连接超时和读取超时是两个不同的东西,而不是同一个东西。您已经设置了一个,但也经历了另一个。那么,在这种情况下如何设置读取超时?当未启用starttls时,您是否仍然会获得很长的超时?我认为Java Mail中可能存在一个错误,启用starttls时超时时间变得很长。starttls是什么意思?当我替换
prop.put(“Mail.smtp.connectiontimeout”,1000)时,请参见此代码>通过prop.put(“mail.smtp.timeout”,1000)代码>根据我的代码,什么也没发生。我必须再次等待5分钟才能捕获javax.mail.MessagineException:java.net.SocketTimeoutException:Read timed out
您使用的是什么版本的JavaMail?如果打开会话调试,调试输出会显示什么?JavaMail 1.4版本,如果打开调试,它将停止在transport.connect(“mion.elka.pw.edu.pl”,587,registerLog,registerPass)代码>5分钟后,我cath:java.net.SocketTimeoutException:Read timeout
您使用的是非常旧的JavaMail版本。设置超时属性时,请尝试使用字符串而不是整数。旧版本的JavaMail只正确地处理了字符串。你能更具体地回答吗?@robbyone请看我在shamimz回答下面的评论。2013年9月24日22:07,我写道:“不幸的是,将值改为字符串而不是整数没有帮助,我仍然需要等待5分钟。您认为更改为较新版本会解决问题吗?”根据:SMTP协议提供程序支持以下属性,这些属性可以在JavaMail会话
对象中设置。属性始终设置为字符串;类型列描述了字符串的解释方式。我尝试了smtp和smtps。没有工作,大约需要7秒钟。javaxmail的版本是1.6.2