discourse-doctor에서 메일 테스트 실패

./discourse-doctor를 사용하여 SMTP 문제를 해결하려고 합니다.

가장 관련성이 높은 것으로 보이는 이슈는 Yet other SMTP 587 port email various errors 입니다.

제안을 적용하기 전에는 일관되게 타임아웃이 발생했습니다.

다음과 같이 구성한 후:

DISCOURSE_SMTP_FORCE_TLS: true
DISCOURSE_SMTP_ENABLE_START_TLS: false

discourse-doctor에서 다음과 같은 결과가 표시됩니다:

==================== MAIL TEST ====================
강력한 테스트를 위해 http://www.mail-tester.com/에서 주소를 가져오세요.
또는 단순히 자신에게 테스트 메시지를 보내세요.
메일 테스트를 위한 이메일 주소? ('n' 입력 시 건너뜁니다) [admin@burlyqna.org]:
admin@burlyqna.org으로 메일 전송 중. . .
smtp.mailfence.com:465, 사용자 이름: philion@mailfence.com, 일반 인증(plain auth)을 사용하여 admin@burlyqna.org으로 전송 테스트 중.
SMTP 서버 연결 성공.
admin@burlyqna.org으로 전송 중. . .
메일 전송 실패.
end of file reached

참조: http://talk.burlyqna.org/NjdhMDAwYTk4NmM3MmM1.txt

외부에서 다음 명령으로 SMTP 서버 구성을 검증할 수 있습니다:

swaks --to philion@gmail.com --from admin@burlyqna.org --server smtp.mailfence.com:465 --auth LOGIN --tlsc --auth-user philion@mailfence.com

SMTP server connection successful.(SMTP 서버 연결 성공)이 표시되는데도 Sending mail failed.(메일 전송 실패)가 발생하는 이유에 대한 힌트가 있을까요?

감사합니다,
Paul

TLS의 경우 포트 587을 사용해야 하나요?

이후에 puts error.backtrace(또는 유사한 코드)를 추가하고 discourse-doctor를 다시 실행해 보세요.

이것은 자동 응답 봇이 만들어낸 결과인데, smtp 도메인 설정을 시도해 보는 것이 가치가 있을 것 같습니다.

Thomas,

서포터럼에서 465 포트에 대한 논의가 많이 이루어지고 있습니다. 제가 파악한 바로는, Discourse가 SMTP를 통한 SSL과 TLS에 대해 많은 가정을 하고 있으며, 상세한 동작 방식을 제어하는 환경 변수가 몇 가지 존재합니다.

그러나 이 포럼에서 보고된 오류와 관련 질문의 수를 고려할 때, 이러한 설정이 문서화가 잘 되어 있지 않고 사용하기가 어렵다는 강한 인상을 받습니다. 2017년까지 거슬러 올라가는 유사한 문제들을 볼 때, 이는 이미 수년간 지속되어 온 문제입니다.

“port 465” 또는 "Net::ReadTimeout smtp"를 검색하면 유사한 문제의 긴 목록을 확인할 수 있습니다.

한번 해볼게요. 감사합니다!

Thomas,

docker 빌드에서 이 파일을 찾으려 해도 찾을 수 없습니다. 컨테이너에 패키징되어 있는 것은 보이지만, 클론한 것은 discourse/discourse가 아니라 discourse/discourse_docker입니다.

launcher enter app로 앱에 진입해도 해당 파일을 편집하거나 vi를 설치할 방법이 없습니다.

./discourse-doctor를 디버그 로그가 켜진 상태로 실행하는 방법에 대한 문서나 플래그도 찾을 수 없습니다.

동일한 방식으로 실패합니다: 이메일을 보낼 수 없으며, ./discourse-doctor가 동일한 오류를 보고합니다.

제안대로 app.yml 파일을 업데이트하고 앱을 다시 빌드(이메일 없음)한 후 ./discourse-doctor를 실행했으나 동일한 오류 메시지가 나타났습니다.

./launcher enter  app
sudo apt update && sudo apt install neovim -y

이렇게 하면 해결됩니다.

감사합니다! sudo apt install vi를 못 쓸 정도면 제 나이가 제법 든 것 같습니다. 이제 neovim이라고 불러야 한다는 걸 기억해야 하니까요.

스택 트레이스를 덤프하도록 제안된 변경 사항에 따라, 다음을 제공합니다: http://talk.burlyqna.org/ODgyZjg5Y2QyMTU1ZmEx.txt

관련 스니펫:

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:237:in `rbuf_fill'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:199:in `readuntil'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:209:in `readline'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1017:in `recv_response'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1008:in `block in getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1027:in `critical'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1006:in `getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:986:in `quit'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:732:in `do_finish'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `ensure in start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/message.rb:269:in `deliver!'
/usr/local/lib/ruby/3.3.0/delegate.rb:87:in `method_missing'
/var/www/discourse/lib/email/sender.rb:296:in `send'

다른 쪽에서 연결을 종료한 것 같습니다.

참고로 http://talk.burlyqna.org/NjdhMDAwYTk4NmM3MmM1.txt 는 더 이상 사용할 수 없습니다.

재빌드할 때 로그 파일이 유지되나요?

기호를 제거하기 위해 비밀번호를 업데이트하고, SMTP 인증 전파 지연 시간(점심을 먹을 수 있을 만큼 충분히)을 기다렸으며, swaks를 사용하여 이메일이 올바르게 전송되도록 자격 증명이 제대로 설정되었는지 확인하고…

같은 오류가 발생합니다.

재빌드하면 스택 트레이스 덤프가 제거되는 것을 확인했으니, 이를 다시 추가하고 ./launcher destroy app && ./launcher start app를 실행해 보겠습니다.

디버그 트레이스를 설치하고 doctor를 실행했습니다:
http://talk.burlyqna.org/NWQ5MjBlMTIwN2JiNGNl.txt

==================== 메일 테스트 ====================
강력한 테스트를 위해 http://www.mail-tester.com/에서 주소를 가져오세요.
또는 자신에게 테스트 메시지를 보내면 됩니다.
메일 테스트용 이메일 주소? ('n' 입력 시 건너뜀) [admin@burlyqna.org]:
admin@burlyqna.org(으)로 메일 전송 중. . .
smtp.mailfence.com:465, 사용자 이름:philion, 일반 인증을 사용하여 admin@burlyqna.org(으)로 전송 테스트 중.
SMTP 서버 연결 성공.
admin@burlyqna.org(으)로 전송 중. . .
메일 전송 실패.
파일 끝 도달
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:237:in `rbuf_fill'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:199:in `readuntil'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:209:in `readline'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1017:in `recv_response'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1008:in `block in getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1027:in `critical'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:1006:in `getok'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:986:in `quit'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:732:in `do_finish'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `ensure in start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-smtp-0.5.1/lib/net/smtp.rb:645:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mail-2.8.1/lib/mail/message.rb:269:in `deliver!'

로그인 이름으로 전체 이메일 주소를 사용해 보셨나요?

app.yml을 사용자를 전체 이메일로 사용하도록 업데이트하고, ./launcher destroy app && ./launcher start app 명령으로 재배포했습니다.

동일한 오류가 발생했습니다: http://talk.burlyqna.org/ZDg1YWE1YTA2YWU1Zjhj.txt

destroy와 start 명령은 디버그 정보도 함께 삭제했지만, 동일한 문제라고 가정합니다:

case rv = @io.read_nonblock(BUFSIZE, tmp, exception: false)

이 nil을 반환하고, 이로 인해 EOF 및 non/error 응답이 발생한다고 봅니다.

많은 테스트와 @thoka 님의 도움을 거쳐, 다음과 같은 요약을 제공합니다:

container/app.yml에 제공한 동일한 자격 증명을 사용하여 SMTP 테스트를 실행할 수 있으며, 이 자격 증명은 swaks(Swaks - Swiss Army Knife for SMTP)와 @thoka 님이 제공한 샘플 Ruby 코드(아래 참조) 모두에서 정상적으로 작동합니다.

이 방법들은 일관되게 작동합니다. 그러나 Discourse 서버를 설정할 때(관리자 사용자에게 초기 이메일을 보내지 못하는 상태) 또는 discourse-doctor 봇을 사용할 경우 이메일 전송 실패가 발생합니다:

==================== MAIL TEST ====================
For a robust test, get an address from http://www.mail-tester.com/
Or just send a test message to yourself.
Email address for mail test? ('n' to skip) [admin@burlyqna.org]:
Sending mail to admin@burlyqna.org. . .
Testing sending to admin@burlyqna.org using smtp.mailfence.com:465, username:xxx@mailfence.com with plain auth.
SMTP server connection successful.
Sending to admin@burlyqna.org. . .
Sending mail failed.
end of file reached

표준 Ruby 도구를 사용하면 테스트 이메일을 전송할 수 있으므로, 이는 프로토콜 구성 실패로 보입니다:

require 'mail'

SMTP_SERVER = 'smtp.mailfence.com'
SMTP_PORT = 465
USERNAME = 'xyz'
PASSWORD = '...'

FROM = 'admin@burlyqna.org'
TO = 'testing@gmail.com'
SUBJECT = 'Test from Ruby'

BODY = "Hello,\n\nThis is a test email sent from Ruby over a SSL-secured connection.\n\nBest regards!"

Mail.defaults do
  delivery_method :smtp, {
    address: SMTP_SERVER,
    port: SMTP_PORT,
    user_name: USERNAME,
    password: PASSWORD,
    domain: "burlyqna.org",
    enable_starttls_auto: :false,
    authentication: :plain,
    ssl: true,
  }
end

begin
  puts 'Sending email...'
  puts "SMTP_SERVER: #{SMTP_SERVER}"
  puts "SMTP_PORT: #{SMTP_PORT}"
  puts "USERNAME: #{USERNAME}"
  puts "PASSWORD: #{PASSWORD}"
  puts "FROM: #{FROM}"
  puts "TO: #{TO}"

  mail = Mail.new do
    to TO
    from FROM
    subject SUBJECT
    body BODY
  end

  mail.deliver!
end

현재 제 app.yml의 SMTP 설정은 다음과 같습니다:

DISCOURSE_SMTP_ADDRESS: smtp.mailfence.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: xxx@mailfence.com
DISCOURSE_SMTP_PASSWORD: '...'
DISCOURSE_SMTP_FORCE_TLS: true                   # https://meta.discourse.org/t/cannot-send-email-problem-with-port-465/246004/8
DISCOURSE_SMTP_ENABLE_START_TLS: false           # (선택 사항, 기본값 true)
DISCOURSE_SMTP_DOMAIN: burlyqna.org              # (일부 제공업체에서 필수)
DISCOURSE_NOTIFICATION_EMAIL: noreply@talk.burlyqna.org

마지막 업데이트: 이메일이 작동합니다!

과정에 겪었던 문제들:

  • DISCOURSE_SMTP_PASSWORD에 기호가 포함되어 있었지만 따옴표로 감싸지 않았습니다.
  • SSL을 작동시키기 위해 DISCOURSE_SMTP_FORCE_TLS: true로 설정했습니다.
  • TLS 핸드셰이크를 중지하기 위해 DISCOURSE_SMTP_ENABLE_START_TLS: false로 설정했습니다.
  • 존재하지 않는 이메일 주소로 DISCOURSE_NOTIFICATION_EMAIL이 설정되어 있었습니다.
DISCOURSE_SMTP_ADDRESS: smtp.mailfence.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: example@mailfence.com
DISCOURSE_SMTP_PASSWORD: 'passwd'
DISCOURSE_SMTP_FORCE_TLS: true                  
DISCOURSE_SMTP_ENABLE_START_TLS: false
DISCOURSE_NOTIFICATION_EMAIL: admin@example.org