SMTP 오류: 먼저 STARTTLS 명령을 실행해야 합니다

Discourse 2.7.0.beta4를 Mailersend SMTP 서비스로 설정하려고 합니다.

./discourse-doctor를 실행한 후 아래 오류가 발생했습니다.

SMTP error: Must issue a STARTTLS command first

현재 SMTP 관련 app.yml 설정은 다음과 같습니다.

  DISCOURSE_SMTP_ADDRESS: 'smtp.mailersend.net'
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: username@subdomain.domain.org
  DISCOURSE_SMTP_PASSWORD: mypasswordhere
 #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
 #DISCOURSE_SMTP_AUTHENTICATION: login
 #DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

이미 주석을 해제하고 DISCOURSE_SMTP_ENABLE_START_TLS를 명시적으로 true로 설정해 보았지만, 오류가 계속됩니다. DISCOURSE_SMTP_AUTHENTICATION: login도 마찬가지입니다.

YML 파일에 변경 사항을 적용한 후에는 다음 명령어로 시스템을 재시작하고 있습니다:

./launcher destroy app; ./launcher start app

무엇이 문제인지에 대한 조언이 있다면 알려주세요.

미리 감사드립니다!

최근에 discourse-setup을 일부 수정했고, 사용하고 계신 rake 태스크에도 변경사항을 넣었습니다(아직 병합되지 않은 것으로 보입니다).

서버에 대한 접근 권한을 주시면 확인해 보겠습니다.

개인 메시지에서 말씀드린 대로, 보안상의 이유로 서버에 대한 접근 권한을 부여할 수 없습니다. 하지만 이 문제를 해결하기 위해 도움을 주시고 시도해 주신 @pfaffman님께 진심으로 감사드립니다.

이 문제에 대해 추가적인 맥락을 설명드리겠습니다. 이전 관리자가 Mailgun SMTP 서비스를 사용하여 Discourse를 설치했지만, 서비스가 더 이상 작동하지 않고 해당 계정에 대한 접근 권한도 없습니다.

말씀드린 대로, 현재 Mailersend로 설정을 변경하려고 시도하고 있습니다. 이 포럼에서 STARTTLS에 대해 이 [1] 주제와 다른 주제들을 읽었지만, 필요한 변경 사항을 어떻게 구현해야 하는지 확실하지 않습니다.

아래 설정도 시도해 보았지만, 오류는 여전히 지속됩니다.

DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

최근 업데이트와 관련이 있다면, 다운그레이드를 고려하는 것이 더 나을 수도 있을까요?

[1] Can't send email with certificate issue - #3 by supermathie

이것을 작동하게 만들었나요?

아니요, 다른 메일 서비스로 변경하기로 결정했습니다. 지금은 Mailjet을 통해 정상적으로 작동하고 있습니다.

나도 비슷한 문제를 겪고 있습니다. 어제 새 Discourse 인스턴스에서 이메일 전송을 약 3시간 동안 디버깅했지만 아무런 성과가 없었습니다. 포트 587에서 STARTTLS를 사용하여 Fastmail을 통해 이메일을 보내려고 하고 있습니다. 다른 서비스들은 동일한 자격 증명으로 정상 작동합니다.

아래 설정을 사용할 때 “Must issue a STARTTLS command first” 오류 응답을 받지 않습니다:

DISCOURSE_SMTP_ADDRESS: 'smtp.fastmail.com'
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: 'myuser@fastmail.fm'
DISCOURSE_SMTP_PASSWORD: 'mypass'
DISCOURSE_SMTP_ENABLE_START_TLS: true

…이후 ./launcher rebuild app를 실행하고 ./discourse-doctor를 실행한 뒤 이메일을 보내면 500 5.5.1 Invalid command 오류 응답을 받습니다.

오늘 tcpdump를 사용하여 통신을 추적하기 시작했는데, Discourse가 실제로 STARTTLS를 사용하지 않는 것 같다는 것을 알게 되었습니다. Grafana 복구 이메일을 보낼 때 발생하는 과정은 다음과 같습니다:

< 220 smtp.fastmail.com ESMTP ready
> EHLO 9b5ba1569f77
< 250-smtp.fastmail.com
< 250-PIPELINING
< 250-SIZE 71000000
< 250-ENHANCEDSTATUSCODES
< 250-8BITMIME
< 250 STARTTLS
> STARTTLS
< ...[encrypted]

하지만 Discourse의 경우 다음과 같은 일이 발생합니다:

< 220 smtp.fastmail.com ESMTP ready
> EHLO localhost
< 250-smtp.fastmail.com
< 250-PIPELINING
< 250-SIZE 71000000
< 250-ENHANCEDSTATUSCODES
< 250-8BITMIME
< 250 STARTTLS
> AUTH PLAIN [redacted]
< 500 5.5.1 Invalid command

즉, 설정에서 STARTTLS가 활성화되어 있음에도 불구하고 Discourse가 제 자격 증명을 인터넷을 통해 평문으로 전송하고 있는 것처럼 보입니다. 이것은 버그인가요?

또한 ./discourse-doctor를 실행할 때 상단의 “YML SETTINGS” 요약에 다음 항목들이 나열되는 것도 확인했습니다:

==================== YML SETTINGS ====================
DISCOURSE_HOSTNAME=forum.[redacted]
SMTP_ADDRESS=smtp.fastmail.com
DEVELOPER_EMAILS=sysadmin@[redacted]
SMTP_PASSWORD=[redacted]
SMTP_PORT=587
SMTP_USER_NAME=[redacted]@fastmail.fm
LETSENCRYPT_ACCOUNT_EMAIL=

하지만 app.yml에 설정되어 있음에도 DISCOURSE_SMTP_ENABLE_START_TLS에 대한 언급은 없습니다. 이 문제가 관련이 있는지 확실하지 않습니다.

음, 이상하네요. rake admin:create를 통해 사용자 계정을 수동으로 생성한 뒤 로그인했는데, 갑자기 이메일 알림이 정상 작동하더라고요. 하지만 discourse-doctor를 통한 전송은 여전히 실패합니다.

혹시 discourse-doctor가 고장 난 건가요?

죄송합니다. 얼마나 답답하셨을지 잘 알고 있습니다.

가능합니다. 문제가 무엇인지 디버깅하기 위해 몇 가지 작업을 수행하므로, 사용자의 경우를 위해 설계된 로직이 고장 났을 수도 있습니다.

아마도 사용자에게 더 적합한 선택지였을 rake 태스크도 있습니다.

    rake emails:test[x@y.com]

새로운 Discourse 설치에서 이메일 문제 해결하기 가이드를 따르고 계셨나요?

저는 그 명령어를 몰랐는데, 실제로 유용해 보입니다! 다만 결과는 동일합니다:

root@app:/var/www/discourse# rake emails:test redacted@example.com
Testing sending to  using smtp.fastmail.com:587, username:myuser@fastmail.fm with plain auth.
======================================== ERROR ========================================
                                    UNEXPECTED ERROR

500 5.5.1 Invalid command


====================================== SOLUTION =======================================
This is not a common error. No recommended solution exists!

Please report the exact error message above to https://meta.discourse.org/
(And a solution, if you find one!)
=======================================================================================

tcpdump를 살펴보면, 다시 한번 STARTTLS 암호화 없이 AUTH PLAIN 자격 증명을 평문으로 전송하는 것을 확인할 수 있습니다.

네, 해당 페이지를 확인해 보았습니다.

그러나 tcpdump를 기준으로 볼 때, app.yml에서 설정이 활성화되어 있음에도 STARTTLS가 사용되지 않는 것이 진단 도구의 버그로 보입니다. (Discourse 애플리케이션 자체는 실제로 STARTTLS를 사용합니다. 많은 이메일 제공자가 비암호화 이메일 전송도 허용하기 때문에, 이 문제는 누군가가 진단 도구를 사용하고 SMTP를 통한 비암호화 전송을 허용하지 않는 제공자를 사용하는 경우에만 발생한다고 가정합니다.)

아. 그 rake 태스크가 discourse-doctor가 호출하는 것과 같은 것인 것 같습니다. 죄송합니다.

어떤 분이 그 rake 태스크가 실제 프로세스와 더 유사하도록 만들거나, 적어도 무엇이 문제인지 파악하려는 시도가 다소 어설프더라도 포기하지 않도록 살펴봐 주시면 좋겠습니다. 좋은 첫 단계는 "음, XXX가 고장 난 것 같지만, 일단 시도해 보겠습니다…"라고 말하는 것일 것입니다.