23

In my application I connect to server to authenticate users. This is code:

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;
    }

I set connection timeout to 1000 ms = 1s but it's ignore. When i debug and set wrong username and password i catch

javax.mail.MessagingException: java.net.SocketTimeoutException: Read timed out

not after 1000 ms, but after 5000*60 ms = 5 min

What is wrong ? How can i reduce timeoute ?

4

6 回答 6

23

您也可以设置 Socket I/O 超时吗?当它已连接但未能从服务器读取数据时,它将继续等待。

prop.put("mail.smtp.timeout", 1000);

读取超时表示您已连接但无法从服务器读取数据。

于 2013-09-23T23:20:37.340 回答
12

由于您使用的是 SSL,因此您可以尝试配置smtps命名空间,而不是smtp

prop.put("mail.smtps.timeout", 1000);
prop.put("mail.smtps.connectiontimeout", 1000);

顺便说一句:属性中的超时值可以作为int,以及String. JavaMail 将正确处理它们(至少 v1.5+)。

于 2017-07-20T07:51:18.593 回答
11

我有同样的问题。它使用字符串而不是整数。

prop.put("mail.smtp.timeout", "1000");    
prop.put("mail.smtp.connectiontimeout", "1000");    
于 2017-06-09T06:07:42.663 回答
5

No, it is just because value must be a string "1000" and not an integer 1000

于 2015-01-29T10:40:07.997 回答
4

mail.smtp.connectiontimeout
类型:int
描述:套接字连接超时值,以毫秒为单位。此超时由 java.net.Socket 实现。默认为无限超时。

mail.smtp.timeout 类型:int
描述:套接字读取超时值,以毫秒为单位。此超时由 java.net.Socket 实现。默认为无限超时。

mail.smtp.writetimeout 类型:int
描述:套接字写入超时值,以毫秒为单位。这个超时是通过对每个连接使用 java.util.concurrent.ScheduledExecutorService 来实现的,如果超时到期,它会调度一个线程来关闭套接字。因此,使用此超时的开销是每个连接一个线程。默认为无限超时。

于 2021-03-11T13:26:41.383 回答
1

我通过更改为最新版本的 JavaMail(JavaMail 1.5)解决了我的问题。我在那里写了:http: //openejb.979440.n4.nabble.com/Which-version-of-JavaMail-td4665285.html

谢谢大家的帮助,特别是比尔香农:)

于 2013-10-10T14:33:38.170 回答