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

PRにCLA署名を追加していただければ、マージできます。

「いいね!」 2

申し訳ありません、週末が長引きました。完了しました。

参考までに、これはスパマーを抑制するために意図的に行われています。ほとんどの自動スパムツールにも5秒のタイムアウトがあります。

「いいね!」 1

SMTPサーバー側の遅延が均一すぎるため、まさにこれを期待しています。したがって、@Falco が提案し、現在 PR#17863 に含まれている修正は、より多くのユーザーに関連する可能性があります。

core frontend (Headless Firefox) 単体テストにエラーがあります。何が起こっているのか全く分かりませんが、今回の変更でこれがトリガーされるとは予想していません。

「いいね!」 1

PRとテストありがとうございます。マージされました。

「いいね!」 1

このトピックは4日後に自動的に閉じられました。新しい返信は許可されていません。