Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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_Connection Timeout - Fatal编程技术网

为什么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