JavaMail 连接超时不按属性工作

P S*_*tro 2 java jakarta-mail connection-timeout

使用的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;
Run Code Online (Sandbox Code Playgroud)

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

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

jme*_*ens 7

这些属性mail.smtp.connectiontimeoutmail.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) = 7000ms 总时间,但没有单个操作超过超时时间。

在测试环境中

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

如果测试没有按照这种方式进行,则说明您没有正确设置属性(拼写错误或 smtp 与 smtps)。或者你真的很幸运有这么低的延迟。