SMTP 릴레이로 메일 전송 시 발생하는 문제

안녕하세요,
사용자 이름과 비밀번호가 필요 없는 SMTP 릴레이를 통해 이메일을 보내는 데 문제가 발생하고 있습니다. mailx / sendmail을 사용하여 릴레이로 이메일을 보내는 것은 가능합니다.

해당 설정은 다음과 같습니다.

 DISCOURSE_SMTP_ADDRESS: xyz.example.com (가림 처리됨)
 DISCOURSE_SMTP_PORT: 587
 DISCOURSE_SMTP_AUTHENTICATION: plain

discourse_doctor를 실행할 때 반환되는 오류는 다음과 같습니다.

Net::ReadTimeout

데이터를 전송하는 것 같지만 587 포트에서 아무 응답도 받지 못하는 것으로 보아, 전송된 SMTP 메시지가 잘못 작성된 것 같습니다. 이는 Wireshark 트레이스로 증명할 수 있습니다.

문제를 더 자세히 분석할 수 있도록 더 자세한 로깅이나 추가적인 디버깅을 활성화하는 방법에 대해 설명해 주실 수 있을까요? 일반적인 로그에서는 아무런 정보도 얻을 수 없습니다. backtrace를 찾았지만, 저는 Ruby 개발자가 아니기 때문에 이를 해석할 수 없습니다.

/usr/local/lib/ruby/3.2.0/net/protocol.rb:229:in `rbuf_fill'

/usr/local/lib/ruby/3.2.0/net/protocol.rb:199:in `readuntil'

/usr/local/lib/ruby/3.2.0/net/protocol.rb:209:in `readline'

net-smtp-0.3.3/lib/net/smtp.rb:1057:in `recv_response'

net-smtp-0.3.3/lib/net/smtp.rb:659:in `block in do_start'

net-smtp-0.3.3/lib/net/smtp.rb:1067:in `critical'

net-smtp-0.3.3/lib/net/smtp.rb:659:in `do_start'

net-smtp-0.3.3/lib/net/smtp.rb:611:in `start'

/var/www/discourse/vendor/bundle/ruby/3.2.0/bundler/gems/mail-5b700fc95ee6/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'

/var/www/discourse/vendor/bundle/ruby/3.2.0/bundler/gems/mail-5b700fc95ee6/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'

/var/www/discourse/vendor/bundle/ruby/3.2.0/bundler/gems/mail-5b700fc95ee6/lib/mail/message.rb:269:in `deliver!'

/usr/local/lib/ruby/3.2.0/delegate.rb:87:in `method_missing'

/var/www/discourse/lib/email/sender.rb:286:in `send'

/var/www/discourse/app/jobs/regular/user_email.rb:79:in `send_user_email'

/var/www/discourse/app/jobs/regular/user_email.rb:39:in `execute'

/var/www/discourse/plugins/chat/lib/chat/user_email_extension.rb:6:in `execute'

/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform'

rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'

/var/www/discourse/app/jobs/base.rb:236:in `block in perform'

/var/www/discourse/app/jobs/base.rb:232:in `each'

/var/www/discourse/app/jobs/base.rb:232:in `perform'

sidekiq-6.5.8/lib/sidekiq/processor.rb:202:in `execute_job'

sidekiq-6.5.8/lib/sidekiq/processor.rb:170:in `block (2 levels) in process'

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:177:in `block in invoke'

/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call'

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:179:in `block in invoke'

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:182:in `invoke'

sidekiq-6.5.8/lib/sidekiq/processor.rb:169:in `block in process'

sidekiq-6.5.8/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:113:in `local'

sidekiq-6.5.8/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq.rb:44:in `block in <module:Sidekiq>'

sidekiq-6.5.8/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq/processor.rb:263:in `stats'

sidekiq-6.5.8/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:13:in `call'

sidekiq-6.5.8/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:80:in `global'

sidekiq-6.5.8/lib/sidekiq/processor.rb:124:in `block in dispatch'

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:39:in `prepare'

sidekiq-6.5.8/lib/sidekiq/processor.rb:123:in `dispatch'

sidekiq-6.5.8/lib/sidekiq/processor.rb:168:in `process'

sidekiq-6.5.8/lib/sidekiq/processor.rb:78:in `process_one'

sidekiq-6.5.8/lib/sidekiq/processor.rb:68:in `run'

sidekiq-6.5.8/lib/sidekiq/component.rb:8:in `watchdog'

sidekiq-6.5.8/lib/sidekiq/component.rb:17:in `block in safe_thread'

애플리케이션을 최신 안정 버전으로 다운그레이드해 보았지만, 이 문제는 해결되지 않았습니다. 이전에 이 작업을 담당하던 직원이 휴가 중이라, 최신 업데이트가 수행되기 전까지 어떤 버전이었는지 확인하지 못했습니다. 또한 최근 이메일 관련 영역에서 코드 변경 사항이 있었음을 알게 되었습니다. 혹시 그 부분에 문제가 있는 것일까요?

감사합니다.

메일 엔진에서 타임아웃이 발생하고 있을 수 있습니다. 이는 최근 다른 주제에서도 언급된 바 있습니다. Postfix는 기본적으로 5초 타임아웃을 설정하고 있습니다.

이메일을 통한 응답 및 게시가 정상적으로 작동하도록 만드는 데 수일간의 고심이 필요했습니다. Discourse 내부와 메일 서버 모두에서 메일러 설정과 방화벽 설정 등 세부 사항들을 올바르게 설정해야 하기 때문입니다.

아직 메일러 문제를 해결하지 못했는데, 특히 여러 ISP에서 화이트리스트에 등재되는 작업이 남아 있습니다. SPF와 DKIM은 정상적으로 작동하고 있습니다.

답변 감사합니다. 네, 맞습니다. 하지만 제가 찾는 것은 문제의 원인을 알려주는 것입니다. Wireshark 트레이스를 보면 이메일은 전송되었는데 응답이 없는 것이 문제입니다. Linux sendmail을 이용한 일반 이메일은 아무 문제 없이 잘 작동합니다. 해당 도메인에는 SPF와 DKIM도 설정되어 있습니다. Rails 콘솔에서 문제를 재현할 수 있습니다.

message = TestMailer.send_test(“ycxi@examle.com”)
Email::Sender.new(message, :test_message).send

저는 Ruby 전문가가 아니지만, 스택 트레이스보다 더 자세한 로그를 얻을 수 있는지 확인해 보겠습니다:

[5] pry(main)> wtf?
Exception: Net::ReadTimeout: Net::ReadTimeout

app.yml 파일에서 SMTP 타임아웃 임계값을 증가시켜 유사한 문제를 해결했습니다. 이 주제에 대한 참조:

app.yml 파일이 수정된 내용:
image

yaml 파일을 변경한 후 앱을 다시 빌드했습니다:
sudo ./launcher destroy app && sudo ./launcher start app

변경 사항은 GUI에 반영됩니다.