이메일 전송 실패 - 포트 465 문제

SMTP 제공자를 변경하려고 하는데, 서버가 이메일을 보낼 수 있다는 것을 확신하고 있음에도 불구하고 작동하지 않는 것 같습니다.

app.yml 파일에는 다음과 같이 설정되어 있습니다:

  DISCOURSE_SMTP_ADDRESS: <<SMTP SERVER>>
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: <<USER>>
  DISCOURSE_SMTP_PASSWORD: <<PASSWORD>>

telnet <<SMTP SERVER>> 465를 실행하면 정상적으로 연결되지만, 이메일을 보내려고 하면 Discourse에서 다음과 같은 오류가 반환됩니다:

ERROR - Net::ReadTimeout with #<Socket:(closed)> 

무엇을 설정해야 하는지 방향을 잡아줄 수 있는 분이 있을까요?

이 주제에 기반하여 서버를 확인해 보았습니다: Troubleshoot email on a new Discourse install

수동으로 그렇게 하면 서버에 연결하고 테스트 이메일을 올바르게 보내는 것 같습니다:

> sudo ./launcher enter app
root@support-app:/var/www/discourse# openssl s_client -connect mail.xxxxxxxx.com:465
  :
  :
  massive amount of junk
  :
  :
220 xxxxxxx.com Anti-spam GT for Coremail System (mispb-6da2110f-64b0-4d67-acf1-2d302bd594f9-xxxxxxx.com[20220915])
EHLO mail.xxxxxxxxx.com
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrUDI0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrpDiNKUCa0xDrUUUUj
250-STARTTLS
250-SMTPUTF8
250 8BITMIME
AUTH PLAIN xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
235 Authentication successful
mail from: <xxx@xxxxxx.com>
250 Mail OK
rcpt to: <xxxx@xxxxxxx.com>
250 Mail OK
data
354 End data with <CR><LF>.<CR><LF>
content

.
250 Mail OK queued as AQAAfwBXr9nSGHdj3hEgAA--.7073S2

출력이 표시되는 데 얼마나 걸립니까?

명령을 보낸 직후 거의 즉시 표시됩니다.

수정: 어떤 단계에서 오류가 발생하는지 파악할 수 있도록 더 자세한 로깅을 받을 수 있는 방법이 있나요?

출력 포트가 호스팅 제공업체에 의해 차단되고 있을 가능성이 높습니다. Mailgun(또는 대부분의 기타 서비스)을 사용하는 경우 포트 2525가 작동해야 합니다. 직접 운영하는 메일 서버인 경우, 다른 포트(예: 2525)를 경청하도록 설정할 수 있습니다.

또는 (아마도 가장 어려운 방법이지만) 서버를 호스팅하는 업체에 티켓을 열어 해당 포트를 열도록 요청할 수 있습니다.

음, ./launcher enter app를 실행한 후 openssl로 메일 서버에 연결하여 SMTP로 로그인하고 discourse 컨테이너 내에서 이메일을 성공적으로 보낼 수 있으니, 포트가 문제라고는 생각되지 않습니다…

코드를 추적해 보니 EHLO 명령어에 도달조차 하지 못한 것 같습니다. SMTP 서버는 연결되어 있지만 SSL 핸드셰이크가 누락된 것으로 보이며, 이로 인해 서버가 종료되고 Discourse가 응답을 받지 못해 오류가 발생한 것입니다.

따라서 포트 465 지원에 버그가 있는 것으로 추정됩니다. (기본값으로 SSL을 사용하지만, Discourse가 이를 인식하지 못하는 것 같습니다) 그래서 아마도 SSL 연결이 결코 수립되지 않는 것 같습니다.

포트 25로 전환하면 적어도 오류는 사라지지만, 아직 전송된 이메일을 받지 못하고 있습니다…

수정: 포트 25가 정상적으로 작동하는 것을 확인했습니다. (587도 작동해야 하지만, 불행히도 제 SMTP 서버는 587 포트를 노출하지 않습니다.)

이전에 이메일을 받지 못한 이유는 Discourse 서버 IP 주소가 너무 많은 실패 시도로 인해 SMTP 서버에 일시적으로 블랙리스트에 등록되었기 때문이었습니다.

당신이 옳은 것 같습니다.

그리고 당신이 처음이 아니라는 것을 알게 되었습니다. DISCOURSE_SMTP_PORT 465를 검색해 보니 비슷한 문제들이 한가득 있었습니다.

마지막 링크에는 가능한 해결책에 대한 링크가 포함되어 있습니다.

With this patch, it's possible to set
DISCOURSE_SMTP_FORCE_TLS=true to use implicit TLS on port 465

또한 '465 포트 문제’에 대한 주제도 꽤 많이 보았습니다. 다만, 명백한 문제가 아닌 이메일 디버깅에는 익숙하지 않아서 문제 해결 가이드를 인용해 왔습니다:

사람들을 돕기 위해 여기에 추가할 수 있는 내용이 있을까요?

@schungx가 DISCOURSE_SMTP_FORCE_TLS=true가 실제로 해결책임을 확인해 줄 수 있다면, 그것을 추가할 수 있습니다.

지금 바로 시도해 보겠습니다!

수정: @RGJ 님, app.yml에서 DISCOURSE_SMTP_FORCE_TLS: true를 설정하면 문제가 성공적으로 해결된다는 것을 확인했습니다! :champagne:

포트 465를 사용하는 경우 DISCOURSE_SMTP_FORCE_TLS: true를 설정하십시오라는 굵은 경고 문구를 추가하는 것이 좋겠습니다. 아니면 Discourse가 이걸 자동으로 감지할 수 있도록 하는 게 더 나은 것 아닌가요?