설치 후 Curl은 이메일을 보낼 수 있지만 Discourse는 보낼 수 없습니다. 해결 방법 알려주세요

안녕하세요!

아래 텍스트에서 <DOT>를 .(마침표)로 치환해 주세요. 저는 신규 사용자라 디스코스가 링크 게시를 허용하지 않아서요.

새로 생성한 Hetzner 클라우드 컴퓨터에 Discourse를 설치했는데, 해당 URL은 잘 해석됩니다: forum<DOT>thewizardofosc<DOT>com

그러나 제가 등록한 이메일은 절대 발송되지 않습니다. 로그 파일에서 Discourse의 로그 메시지가 Net::ReadTimeout으로 표시되는데, 이것이 어떤 의미를 갖는지 궁금합니다.

telnet으로 연결은 됩니다 - "telnet mail<DOT>thewizardofosc<DOT>com 465"를 입력하면 "Connected to thewizardofosc<DOT>com".이라는 응답이 나옵니다.

또한 Curl을 사용하면 이메일을 성공적으로 보낼 수 있습니다!

아래를 입력하면:
curl --ssl smtps://mail<DOT>thewizardofosc<DOT>com --mail-from discourse@thewizardofosc<DOT>com --mail-rcpt <VARIOUS WORKED> --upload-file email.txt --user 'discourse@thewizardofosc<DOT>com:<PASSWORD>'

성공적으로 전송됩니다.

그렇다면 왜 Discourse는 이메일을 보내지 못하는 걸까요?

아래는 제 앱 파일에서 관련이 있다고 생각하는 부분들입니다:

## 초기 가입 시 예시 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'iliasb@thewizardofosc<DOT>com'

## TODO: 새 계정 검증 및 알림 전송에 사용되는 SMTP 메일 서버
# SMTP 주소, 사용자 이름, 비밀번호는 필수입니다
# 경고: SMTP 비밀번호에 '#' 문자가 포함되면 문제가 발생할 수 있습니다!
DISCOURSE_SMTP_ADDRESS: mail<DOT>thewizardofosc<DOT>com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: discourse@thewizardofosc<DOT>com
DISCOURSE_SMTP_PASSWORD: <PASSWORD>
#DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값 true)

## Lets Encrypt 템플릿을 추가했다면, 무료 SSL 인증서를 얻기 위해 아래 주석을 해제하세요
LETSENCRYPT_ACCOUNT_EMAIL: me@example<DOT>com

메일 설정에서 어떤 일이 일어나고 있는지 확인하려면 에러 로그를 확인해야 합니다

여기 있는 단계를 따라 해 보았습니다: Troubleshoot email on a new Discourse install - #2

큰 성과는 없었습니다. discourse-doctor를 실행해도 shared/standalone/log/rails/production.log에서 확인되는 것과 동일한 Net::ReadTimeout 오류가 출력됩니다.

안녕하세요!

shared/standalone/log/rails/production.log 파일을 말씀하시는 건가요?

거기서 다음 내용을 확인했습니다:

Delivered mail 5208d56b-b84b-4de6-a13e-76b60179af46@forum.thewizardofosc.com (60142.6ms)
Job exception: Net::ReadTimeout

이상하네요. 컨테이너 외부에서 연결할 수 있다면, 컨테이너 내부에서 해당 curl 명령이 정상적으로 작동하는지 확인할 수 있습니다. 제 추측으로는 도커 관련 네트워크 문제인 것 같습니다.

Jay의 말이 맞습니다.

@onar3d 님, 다음 논리적 단계는 컨테이너 내부에서 curl 테스트를 실행해 보는 것입니다.

확인해 본 결과 컨테이너에 이미 curl이 설치되어 있으므로, 설치할 필요는 없습니다.

docker exec -it app bash
root@hostname-app/# curl --version
curl 7.64.0 (x86_64-pc-linux-gnu) libcurl/7.64.0 OpenSSL/1.1.1d zlib/1.2.11 libidn2/2.0.5 libpsl/0.20.2 (+libidn2/2.0.5) libssh2/1.8.0 nghttp2/1.36.0 librtmp/2.3
Release-Date: 2019-02-06
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL 

도움이 되길 바랍니다.

흥미로운 제안이네요!

하지만 저는 docker exec -it DOCKERID bash를 사용하여 도커에 진입했고, 동일한 curl 명령을 실행했는데 이 역시 정상적으로 작동했습니다.

감사합니다. 방금 시도해 봤는데 잘 작동했어요!

그러면 Docker가 차단된 건 아닐 텐데…

@onar3d 님 안녕하세요

기대하기는 어렵지만, 587 포트 대신 465 포트를 사용하고 계시므로 컨테이너의 yml 파일에서 다음 설정을 시도해 보시는 건 어떨까요:

DISCOURSE_SMTP_ENABLE_START_TLS: false

그리고 컨테이너를 다시 빌드해서 운이 좋게 해결되는지 확인해 보세요 :slight_smile:

참고:

GMail(예를 들어 비교를 위해)은 다음 포트와 인증 방법을 제공합니다.

  • TLS/STARTTLS(때로는 Explicit TLS라고도 함): 587 포트 사용
  • SSL(때로는 Implicit TLS라고도 함): 465 포트 사용

…이건 좀 운을 거는 셈이네요 :slight_smile: 하지만 운이 좋으면 될지도 모릅니다

안 되면 언제든 되돌릴 수 있습니다.

감사합니다!

방금 시도해 봤는데, Discourse에서 이메일이 전송되지 않았습니다 :confused:

네, 가능성이 낮긴 했죠…… 그 문제로 시간을 낭비하게 해서 죄송합니다!

현재 제가 가진 또 다른 "미친 아이디어"는 메일 서버(누구인지에 따라 다릅니다) 설정에 들어가서 포트를 587로 설정해 보고(많은 SMTP 제공업체가 선택지를 제공합니다), 물론 다시 DISCOURSE_SMTP_ENABLE_START_TLS: true로 “운을 한번 더 시험해 보는” 것입니다.

솔직히 저는 보통 “운에 맡기는” 스타일이 아니라 사실에 기반한 접근을 선호합니다. 그래서 시도하고 싶지 않으시면 완전히 이해합니다 @onar3d !!

감사합니다! unfortunately 저는 그 부분을 변경할 권한이 없어서요. 제 프로바이더가 설정해준 ‘턴키’ 방식 중 하나거든요.

안녕하세요 @onar3d

알겠습니다. 지금은 제 머릿속에 ‘미친 아이디어’가 하나도 남아 있지 않고, 여기서 밤을 보내기 위해 마무리할 시간입니다. 행운을 빕니다. 여기 있는 똑똑한 팀원 중 누군가 더 좋은 아이디어를 내주기를 바랍니다.

좋은 하루 보내세요.

몇 번 더 시도해 본 후(정말 감사드립니다 @IAmGav!), 제 Discourse 설정이 다른 이메일 서버에서는 정상적으로 작동하는 것으로 확인되었습니다. 이는 여러 가지 가능성을 배제할 수 있게 해줍니다.

제 이메일 서버 제공업체로부터 그들의 측에서 발생한 오류 로그 메시지와 제안 사항을 받았습니다:

엔지니어가 로그를 확인한 결과, 해당 IP에서 확인된 오류는 SSL 설정과 관련이 있습니다. 아마도 구버전 또는 연결 설정을 사용하고 있는 것으로 보입니다.

증거:
[95.216.139.49]:33568에서 발생한 TLS 오류: SSL_accept: TCP 연결이 피어에 의해 닫힘

작동하는지 확인하기 위해 SSL 모드를 꺼 두고 시도해 보세요.

위와 같이 DISCOURSE_SMTP_ENABLE_START_TLS를 false로 설정하고, 포트 465와 26(제 제공업체에서 비-SSL 연결용 포트라고 명시한 것)를 모두 시도해 보았지만, 어느 쪽도 작동하지 않았습니다.

더 자세히 읽어본 후 이제야 깨달았지만, 도메인 thewizardofosc.com에 대해 SSL 인증서를 구매하지 않았기 때문일까요?

SSL이 없는 옵션으로 작동하지 않는다면, 유료 SSL을 사용해도 작동하지 않을 것입니다. 이메일 호스트 제공업체가 Let’s Encrypt 무료 SSL을 제공해야 합니다.

안녕하세요, @onar3d님

-v 옵션(즉시 떠올린 것이라 정확하지는 않지만)을 활성화하여 curl 테스트를 실행해 보시는 것도 좋습니다. 이렇게 하면 성공적인 핸드셰이크를 완전히 분석할 수 있고, 그 분석 결과를 바탕으로 역추적하여 문제를 해결해 나갈 수 있습니다.

이 verbose 옵션을 사용하면 어떤 부분이 정상 작동하는지 역설계할 수 있습니다 :slight_smile:

도움이 되셨길 바랍니다.