为什么JavaMail连接超时太长

时间:2013-09-23 23:13:15

标签: java javamail 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 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分钟之后

有什么问题?我怎样才能减少时间?

6 个答案:

答案 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)

ma​​il.smtp.connectiontimeout
类型:int
描述:以毫秒为单位的套接字连接超时值。这个超时是由 java.net.Socket 实现的。默认为无限超时。

ma​​il.smtp.timeout 类型:int
描述:以毫秒为单位的套接字读取超时值。这个超时是由 java.net.Socket 实现的。默认为无限超时。

ma​​il.smtp.writetimeout 类型:int
描述:以毫秒为单位的套接字写入超时值。此超时是通过对每个连接使用 java.util.concurrent.ScheduledExecutorService 来实现的,该服务安排一个线程在超时到期时关闭套接字。因此,使用此超时的开销是每个连接一个线程。默认为无限超时。