首页 > 解决方案 > JavaMail 连接超时不按属性工作

问题描述

使用的 Javax 邮件版本 1.6.2

手动设置 JavaMailSender

我用 mail.smtp.timeout 和 mail.smtps.timeout 尝试过的超时。
而且,我尝试了字符串和整数值 3000。

    String timeOut = "3000";
    Properties pros = new Properties();
    pros.put("mail.smtp.timeout", timeOut);
    pros.put("mail.smtp.connectiontimeout", timeOut);
    pros.put("mail.smtp.writetimeout", timeOut);

    pros.put("mail.smtp.auth", "true");
    pros.put("mail.smtp.starttls.enable", "true");


    jmailSender.setJavaMailProperties(pros);

    return jmailSender;

大约需要 7 秒,没有任何失败。由于默认情况下是无限的,所以很可能它没有以某种方式设置

是否缺少任何属性或其他内容?

标签: javajakarta-mailconnection-timeout

解决方案


属性mail.smtp.connectiontimeout和 `mail.smtps.connectiontimeout仅在建立连接时适用。它与传输期间的任何超时无关。

属性mail.smtp.timeoutmail.smtps.timeout与阻塞等待读取的时间有关。这与读取 SMTP 响应代码有关。

属性mail.smtp.writetimeoutmail.smtps.writetimeout与写入大小不同的数据块有关。

这些超时都不代表发送 mime 消息的单个事务的最后期限。正在发生的事情是没有超过 3000 毫秒的单个操作(连接、读取、写入)。

例如,连接可能需要 1000 毫秒,然后是 30 个请求(写入)和响应解析(读取),需要 100 毫秒,以及一组说 3 次写入以发送消息,每个需要 1000 毫秒,因为网络速度和大小消息。即 1000 + (30 * 100) + (3 * 1000) = 7000 毫秒总时间,但没有单个操作超过超时。

在测试环境中

  1. 将所有超时设置为 3000。
  2. 设置connectimeout为 1 并测试。您应该看到连接失败。
  3. 通过将其设置回 3000 并设置timeout为 1 来重新启动测试。您应该会看到读取失败。
  4. 通过将其设置回 3000 并设置writetimeout为 1 重新启动测试。您应该会看到传输失败。

如果测试没有以这种方式运行,您要么没有正确设置属性(错字或 smtp 与 smtps)。或者你真的很幸运有这么低的延迟。


推荐阅读