在我的应用程序中,我连接到服务器以验证用户身份。这是代码:
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;
}
我将连接超时设置为1000毫秒= 1秒,但它被忽略。当我调试并设置错误的用户名和密码时,我会抓住
javax.mail.MessagingException: java.net.SocketTimeoutException: Read timed out
不是在1000毫秒之后,而是在5000 * 60毫秒= 5分钟之后
有什么问题?我怎样才能减少时间?
答案 0 :(得分:15)
您是否也可以设置套接字I / O超时。当它连接但无法从服务器读取数据时,它将继续等待。
prop.put("mail.smtp.timeout", 1000);
读取超时表示您已连接但无法从服务器读取数据。
答案 1 :(得分:9)
由于您使用的是SSL,因此您可以尝试配置smtp
命名空间,而不是prop.put("mail.smtps.timeout", 1000);
prop.put("mail.smtps.connectiontimeout", 1000);
:
int
BTW:属性中的超时值可以作为String
以及{{1}}传递。 JavaMail将正确处理它们(至少v1.5 +)。
答案 2 :(得分:7)
我遇到了同样的问题。它使用String而不是整数。
prop.put("mail.smtp.timeout", "1000");
prop.put("mail.smtp.connectiontimeout", "1000");
答案 3 :(得分:5)
不,这只是因为价值必须是一个字符串" 1000"而不是整数1000
答案 4 :(得分:2)
我通过更改到最新版本的JavaMail(到JavaMail 1.5)来解决我的问题。我在那里写到:http://openejb.979440.n4.nabble.com/Which-version-of-JavaMail-td4665285.html
谢谢大家的帮助,特别是比尔香农:)答案 5 :(得分:0)
mail.smtp.connectiontimeout
类型:int
描述:以毫秒为单位的套接字连接超时值。这个超时是由 java.net.Socket 实现的。默认为无限超时。
mail.smtp.timeout
类型:int
描述:以毫秒为单位的套接字读取超时值。这个超时是由 java.net.Socket 实现的。默认为无限超时。
mail.smtp.writetimeout
类型:int
描述:以毫秒为单位的套接字写入超时值。此超时是通过对每个连接使用 java.util.concurrent.ScheduledExecutorService 来实现的,该服务安排一个线程在超时到期时关闭套接字。因此,使用此超时的开销是每个连接一个线程。默认为无限超时。