JavaMail 连接超时不按照属性工作

JavaMail connection timeout is not working as per properties

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 秒,没有任何失败。 由于默认情况下是无限的,所以很可能它没有以某种方式设置

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

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

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

属性 mail.smtp.writetimeout and mail.smtps.writetimeout 与写入大小可变的数据块有关。

None 这些超时表示发送 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)。或者你真的很幸运能有这么低的延迟。