로컬 SMTP 서버를 사용하여 이메일을 보낼 수 없음

SMTP 서버를 Telnet으로 테스트했습니다:
Telnet으로 SMTP 서버에 연결했습니다.
Telnet을 통해 SMTP 서버에 인증할 수 있었습니다.
Telnet을 사용하여 SMTP 서버를 통해 이메일을 성공적으로 보냈으며, /var/discourse/containers/app.yaml 파일에 있는 값과 동일한 값을 Telnet에서 사용했습니다.

Discourse doctor는 Discourse가 SMTP 서버에 성공적으로 연결되었다고 보고합니다.
Discourse doctor는 Discourse가 테스트 이메일을 보내지 못했다고 보고합니다.

따라서, Discourse에는 이메일을 보내는 것을 방해하는 버그가 있습니다.

Discourse의 버그보다는 설정에 문제가 있는 것 같습니다. :wink:

혹시 smtp-relay.gmail.com을 사용 중이신가요? 아마 DigitalOcean에서 사용 중이신 건가요? 최근 이 문제가 발생했는데, 아직 정확한 원인은 파악되지 않았습니다.

아니요. 이미 설명한 대로 SMTP 서버는 완벽하게 작동하고 있으며, Discourse도 올바르게 설치되어 관리자 등록 이메일을 입력하도록 요구하는 화면을 정상적으로 표시합니다. 그러나 해당 이메일이 전송되지 않습니다.

저는 Discourse Docker 컨테이너와 동일한 머신에 위치한 로컬 SMTP 서버를 사용하고 있습니다.

/var/discourse/shared/standalone/log/rails/production.log 파일에서 오류를 발견했습니다:

Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.1ms | Allocations: 32)
Delivered mail f915c15e-9c4d-4d4e-9527-81bc4984540c@forum.domain.com (63.7ms)
Job exception: hostname "mail.forum.domain.com" does not match the server certificate

이 오류는 무엇을 의미하나요?

위 오류 메시지는 서버의 SSL 인증서에 관한 것으로 보입니다.

서버의 SSL 인증서는 정확하며 올바른 호스트명을 가지고 있습니다.

이것은 Discourse의 버그로 보이며, Discourse가 서버의 SSL 인증서를 올바르게 감지하지 못하는 것으로 보입니다.

이것은 Discourse의 버그처럼 들리지 않습니다. 호스트 DNS 리졸버 설정 또는 SSL 인증서와 관련된 문제인 것 같습니다.

telnet은 SSL을 사용하지 않으므로, 그것이 작동하는 이유라고 추측됩니다. Linux에서는 OpenSSL을 사용하여 연결을 테스트하고 인증서를 검사함으로써 조금 더 심층적인 테스트를 수행할 수 있습니다.

아래 링크의 정보가 도움이 될 수 있습니다: https://docs.pingidentity.com/bundle/solution-guides/page/iqs1569423823079.html

사이트의 https가 작동하는 이유는 주소창에 녹색 자물쇠 아이콘이 표시되기 때문입니다. 사이트의 SSL 인증서에 문제가 있는 것은 아닙니다. Discourse가 SSL 인증서를 감지하는 방식에 문제가 있는 것입니다.

해당 오류는 사이트 인증서가 아니라 SMTP 서비스 인증서와 관련된 것입니다.

SMTP 서비스 인증서는 웹 사이트의 SSL 인증서가 아니라 서버의 SSL 인증서입니다. 서버 SSL 인증서는 올바르고 정상적으로 작동하고 있습니다.

Discourse 컨테이너와 동일한 머신에 로컬 SMTP 서버를 설정할 때, app.yml의 SMTP 설정에 대해 올바른 값이 무엇인지 Discourse에서 정확히 명시하지 않습니다. 이로 인해 많은 혼란과 오류가 발생합니다.

app.yml 설정에서 Discourse는 DISCOURSE_SMTP_ADDRESS가 무엇을 의미해야 하는지 명확히 설명하지 않습니다.

실제로 이는 mail.subdomain.domain.com이 아니라 subdomain.domain.com입니다.

올바른 값:
DISCOURSE_SMTP_ADDRESS: forum.domain.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: postmaster@forum.domain.com
DISCOURSE_SMTP_PASSWORD: "password"
DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값 true)

초기 가입 이메일 전송 실패 후 나타나는 오류 문구에서 Discourse는 "서버 인증서"가 무엇인지 명확히 설명하지 않습니다. 오류 메시지는 다음 위치에 있습니다:
/discourse/shared/standalone/log/rails/production.log
“Job exception: hostname “mail.forum.domain.com” does not match the server certificate”.

그러나 실제로 "서버 인증서"란 단순히 서버의 SSL 인증서를 의미합니다.
또한 오류 메시지에서는 실제로 DISCOURSE_SMTP_ADDRESS를 가리키고 있음에도 불구하고 "hostname"이라고 잘못 언급하고 있습니다.

Discourse의 모호함 때문에 많은 어려움을 겪었습니다.

해결책은 단순히 서버의 SSL 인증서를 올바른 SSL 인증서로 설정하는 것이었습니다.

이 문제를 Discourse 포럼에 게시했을 때, 많은 오해의 소지가 있고 불분명한 답변들이 있었습니다.

Discourse는 이러한 문제들을 수정해야 합니다.

지금 Discourse doctor가 이메일이 전송되었다고 표시합니다:

admin@email.com으로 메일 전송 중... 
forum.domain.com:587을 사용하여 admin@email.com으로 전송 테스트 중.
SMTP 서버 연결 성공.
admin@email.com으로 전송 중... 
메일이 SMTP 서버에 의해 수락됨.

하지만 수신함이나 스팸 폴더에 이메일이 없습니다.

이 문제를 어떻게 수정할 수 있을까요?

로컬 SMTP 서버의 로그를 확인하세요. Discourse가 SMTP 서버에 올바르게 전달했다면, 그 이후는 Discourse의 관할 범위를 벗어납니다.

Exim4 로그에 오류 메시지가 있는데, 이것이 무슨 의미인가요?

2021-01-21 00:39:39 H=(localhost.localdomain) [172.17.0.2] X=TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256 CV=no F=<noreply@forum.domain.com> A=dovecot_plain:postmaster@forum.domain.com rejected RCPT <admin@email.com>: Sender verify failed