いくつかのコンテキスト:Emails have stopped sending - end of file reached
約 1 週間前(2021 年 1 月 13 日)、Google Apps ユーザーにとって許可され、意図された使用法である Google の smtp-relay.gmail.com サーバーを介してのメール送信が失敗し始めました。
Sidekiq は EOFErrors を伴う失敗を報告しました:
Jobs::HandledExceptionWrapper: Wrapped EOFError: end of file reached
また、/logs にも失敗したタスクが記録されていました:
Job exception: end of file reached
バックトレースは他の投稿で利用可能です。
===================
調査の結果、最新バージョンの Discourse インストールは SMTP リレーに ‘EHLO localhost’ で接続していることが判明しました。Google は約 1 週間前からこれを拒否し始めました。
本番環境インスタンスでの tcpdump 出力:
0x0030: d10f f8e4 4548 4c4f 206c 6f63 616c 686f ....EHLO.localho
0x0040: 7374 0d0a st..
...
0x0030: de62 f0c3 3432 3120 342e 372e 3020 5472 .b..421.4.7.0.Tr
0x0040: 7920 6167 6169 6e20 6c61 7465 722c 2063 y.again.later,.c
0x0050: 6c6f 7369 6e67 2063 6f6e 6e65 6374 696f losing.connectio
0x0060: 6e2e 2028 4548 4c4f 2920 6a31 3673 6d34 n..(EHLO).j16sm4
0x0070: 3831 3932 3976 736d 2e31 202d 2067 736d 81929vsm.1.-.gsm
0x0080: 7470 0d0a tp..
telnet で再現しても同じ結果になります:
root@conversation:~# telnet smtp-relay.gmail.com 587
Trying 74.125.137.28...
Connected to smtp-relay.gmail.com.
Escape character is '^]'.
220 smtp-relay.gmail.com ESMTP ls8sm507258pjb.6 - gsmtp
ehlo localhost.localdomain
421 4.7.0 Try again later, closing connection. (EHLO) ls8sm507258pjb.6 - gsmtp
Connection closed by foreign host.
ただし、ドメイン固有の ehlo は正常に動作します:
root@conversation:~# telnet smtp-relay.gmail.com 587
Trying 74.125.137.28...
Connected to smtp-relay.gmail.com.
Escape character is '^]'.
220 smtp-relay.gmail.com ESMTP p10sm668563uaw.3 - gsmtp
ehlo conversation.sevarg.net
250-smtp-relay.gmail.com at your service, [64.227.96.27]
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
======
ログに基づき、修正をテストするために変更するファイル(docker イメージ内)を特定しました:
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb
以下を変更:
DEFAULTS = {
:address => 'localhost',
:port => 25,
:domain => 'localhost.localdomain',
以下へ:
DEFAULTS = {
:address => 'conversation.sevarg.net',
:port => 25,
:domain => 'conversation.sevarg.net',
これにより問題が解決しました(インスタンスの再起動後)。EHLO がドメイン文字列で送信されるようになり、メールが正常に送信されるようになりました。
================
望ましい動作:メール送信時、デフォルトの Discourse インストールは SMTP サーバーへの初期接続に設定されたドメイン名を使用すること。あるいは、送信されるドメインを上書きする設定オプションが存在すること。もし存在する場合、検索しても見つけることができませんでした。