여기에 관련 컨텍스트가 있습니다: Emails have stopped sending - end of file reached
대략 일주일 전(2021년 1월 13일)부터 Google의 smtp-relay.gmail.com 서버를 통한 이메일 전송이 실패하기 시작했습니다(이것은 Google Apps 사용자에게 허용되고 의도된 사용 방식입니다).
Sidekiq는 EOFError로 실패를 보고했습니다:
Jobs::HandledExceptionWrapper: Wrapped EOFError: end of file reached
그리고 /logs에도 실패한 작업이 보고되었습니다:
Job exception: end of file reached
백트레이스는 다른 게시글에서 확인하실 수 있습니다.
===================
조사를 통해 최신 Discourse 설치 환경이 SMTP 릴레이에 'EHLO localhost’로 연결하고 있으며, Google이 대략 일주일 전부터 이러한 요청을 거부하기 시작했음을 발견했습니다.
프로덕션 인스턴스의 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
======
로그를 기반으로 수정 사항을 테스트하기 위해 변경해야 할 파일을 식별했습니다(도커 이미지 내):
/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 서버와의 초기 연결에 구성된 도메인 이름을 사용해야 합니다. 또는, 전송되는 도메인을 오버라이드할 수 있는 구성 옵션이 존재해야 합니다. 만약 이러한 옵션이 존재한다면, 검색을 통해 찾을 수 없었습니다.