SMTP Net::ReadTimeout 与网络或登录问题无关 - SMTP 主机速度很慢

您好,
几周以来,我从 Discourse 实例发送邮件一直失败。SMTP 设置未更改,curl 测试仍然有效,但明显变慢。我们主机提供商的 SMTP 服务器(我们需要用它发送邮件)的发送时间稳定在 7 秒。

cat testmail | curl -vvv --url 'smtp://smtp.<HOST>:587' --mail-from mail@<DOMAIN> --mail-rcpt <ME> --user "mail@<DOMAIN>:<PW>" -T -

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying <IP>...
* Connected to smtp.<HOST> (<IP>) port 587 (#0)
< 220 mailproxy1.<HOST> Dovecot ready.
> EHLO ecm2
< 250-mailproxy1.<HOST>
< 250-8BITMIME
< 250-AUTH PLAIN LOGIN
< 250-BURL imap
< 250-ENHANCEDSTATUSCODES
< 250-SIZE
< 250-STARTTLS
< 250 PIPELINING
> AUTH PLAIN
< 334 
> xxxxxx=
  0     0    0     0    0     0      0      0 --:--:--  0:00:06 --:--:--     0< 235 2.7.0 Authentication successful
  0     0    0     0    0     0      0      0 --:--:--  0:00:07 --:--:--     0> MAIL FROM:<mail@<DOMAIN>>
< 250 2.1.0 Ok
> RCPT TO:<ME>
< 250 2.1.5 Ok
> DATA
< 354 End data with <CR><LF>.<CR><LF>
} [89 bytes data]
100    89    0     0    0    89      0     11 --:--:--  0:00:07 --:--:--    20< 250 2.0.0 Ok: queued as 356C3288C85
100    89    0     0    0    89      0     11 --:--:--  0:00:07 --:--:--    26
* Connection #0 to host smtp.<HOST> left intact

我将其与我们内部邮件服务器进行了比较,每封邮件不到 1 秒。来自邮件主机商的 7 秒本来不是什么大问题,但我无法找到一个设置来解除(似乎是硬编码的?)5 秒超时。open_timeout 以及在我看来更相关的 read_timeout 也可以在 /admin/email 的测试界面中看到:

  • Docker 应用程序容器中的计时与本地测试或 Docker 主机上的测试相同。
  • cURL 发送的邮件已正确送达(在等待 7 秒后立即送达)。
  • 出于隐私原因,sendgrid、mailgun 等常用解决方案很遗憾无法使用。
  • 也许切换到 ActionMailer 7.0.x 触发了我的这个问题?

感谢您提供关于如何配置 read_timeout 的任何建议。

1 个赞

为此,有必要在以下位置添加这些新设置:

看起来像这样:

  if GlobalSetting.smtp_address
    settings = {
      address: GlobalSetting.smtp_address,
      port: GlobalSetting.smtp_port,
      domain: GlobalSetting.smtp_domain,
      user_name: GlobalSetting.smtp_user_name,
      password: GlobalSetting.smtp_password,
      authentication: GlobalSetting.smtp_authentication,
      enable_starttls_auto: GlobalSetting.smtp_enable_start_tls,
+     open_timeout: GlobalSetting.smtp_open_timeout,
+     read_timeout: GlobalSetting.smtp_read_timeout
    }

您能提交一个包含这些更改的拉取请求吗?

2 个赞

@Falco

感谢您的快速回复。您说得对,这些更改已生效:

  • app.yml 中的新超时设置已显示
  • 邮件可以发送。

由于我几乎不懂 Ruby,我会尽力准备拉取请求,并且非常感谢您和 Discourse 社区的帮助。

此致

Roland

2 个赞

PR 在线:Allow configuration of smtp timeout settings by rolandkoller · Pull Request #17863 · discourse/discourse · GitHub

如果您能就如何/是否可以改进 PR 提供任何意见,我将不胜感激。

4 个赞

我们需要您提供一份CLA签名才能合并此PR。

2 个赞

抱歉,周末过得有点长。完成了。

供参考,他们这样做是为了阻止垃圾邮件发送者。大多数自动垃圾邮件工具也有 5 秒的超时时间。

1 个赞

我期望是这样,因为 SMTP 服务器端的延迟过于均匀。因此,@Falco 提出的现已包含在 PR#17863 中的修复程序可能与更多用户相关。

core frontend (Headless Firefox) 单元测试中存在一个错误。我对此并不了解,但我不认为这是由我们在此处的更改触发的。

1 个赞

感谢您的 PR 和测试。现已合并。

1 个赞

此主题已在 4 天后自动关闭。不再允许回复。