GMail의 smtp-relay에서 SMTP 설정이 작동하지 않습니다

Discourse와 GMail SMTP를 연동하여 SMTP 설정을 제대로 작동시키지 못하고 있습니다.

Google 설정에서 SMTP 중계(SMTP Relay)를 활성화하고, 내 도메인에서 발신하는 것을 허용했습니다(IP 화이트리스트 없음). SMTP 인증 + 암호화를 사용하고 있습니다.

Discourse는 forum.example.com에 호스팅되어 있습니다.

DISCOURSE_SMTP_ADDRESS: smtp-relay.gmail.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: noreply@example.com
DISCOURSE_SMTP_PASSWORD: password
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_DOMAIN: mydomain.io
DISCOURSE_NOTIFICATION_EMAIL: noreply@example.com
DISCOURSE_SMTP_ENABLE_START_TLS: true

NOTIFICATION_EMAIL과 SMTP_DOMAIN 환경 변수를 추가했을 때 Job exception: end of file reached라는 일반적인 오류가 발생했고, 이제 doctor를 실행하고 나에게 이메일을 보내려고 할 때 다음과 같은 오류를 확인하고 있습니다.

503 5.5.1 bad sequence of commands x20sm63393lfr.126 - gsmtp

DISCOURSE_SMTP_DOMAIN을 forum.mydomain.io와 일치하도록 변경했지만 여전히 동일한 오류가 발생합니다.

환경 변수를 변경하고, 다시 빌드하고, 작동하기를 바라는 것 외에 이 문제를 어떻게 더 디버깅해야 합니까?

미리 감사드립니다.

재구축 대신 다음을 실행할 수 있습니다.

./launcher destroy app 
./launcher start app 

구글 관련 설정을 작동시키는 방법에 대한 몇 가지 주제가 있습니다. 작동은 가능하지만 쉽지 않습니다. 그리고 아마도 매달 변경될 것입니다. :wink:

저는 @kvsf 님의 오류가 이미 수정되었거나, 설정 내에서 근본적인 부분들이 변경되었을 것이라고 생각하지만, 같은 문제 영역 내에서 제 설정, 추가적인 접근 방법, 그리고 도움을 구하기 위해 이 스레드를 계속 이어가고자 합니다.

기본 설정

  • Google Workspace Business Starter
  • Gmail 라우팅 구성 > SMTP 릴레이 설정: i) 도메인 내 등록 사용자만 허용, ii) 포럼 호스팅 서버 IP를 통한 IP 화이트리스트 적용 및 SMTP 인증 강제, iii) TLS 강제 적용
  • discourse 문서에 따른 discourse docker 설치
  • 아래에 따른 app.yml 설정
expose:
  - "80:80"   # http
  - "443:443" # https

env:
  DISCOURSE_HOSTNAME: "forum.mydomain.com"
  DISCOURSE_DEVELOPER_EMAILS: 'dev@mydomain.com'

  DISCOURSE_SMTP_ADDRESS: "smtp-relay.gmail.com"
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: "user@mydomain.com"
  DISCOURSE_SMTP_PASSWORD: "mypass"
  DISCOURSE_SMTP_ENABLE_START_TLS: true 
  DISCOURSE_SMTP_AUTHENTICATION: login
  DISCOURSE_SMTP_OPEN_TIMEOUT: 25
  DISCOURSE_SMTP_READ_TIMEOUT: 25
  DISCOURSE_SMTP_DOMAIN: "mydomain.com"
  DISCOURSE_NOTIFICATION_EMAIL: "noreply@mydomain.com"
  LETSENCRYPT_ACCOUNT_EMAIL: dev@mydomain.com

내 테스트

./discourse-doctor를 실행하면 이 설정은 다음과 같은 오류를 발생시킵니다.

Testing sending to ...
SMTP server connection successful.
Sending to artificial.testadress@gmail.com. . .
Sending mail failed.
end of file reached

그 후 먼저 discourse 및 이메일 로그를 확인했습니다.

docker 내부에서 동일한 프로세스를 수동으로 테스트해 보았습니다 (docker exec -it <CONTAINER_ID> bash를 사용하여 연결). 다음 명령을 통해:

openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587

문제는 발생하지 않았고 정상적으로 작동했습니다. 따라서 저는 app.yml의 파라미터 설정이 이상하거나, discourse 내부에서 스크립트 간 통신 오류가 있거나, … 수많은 가능성이 있다고 생각합니다. ^^ app.yml을 변경하여 다양한 설정을 테스트할 때마다 ./launcher rebuild app를 실행하지 않아도 되도록, 기존 코드를 다음과 같이 변경하여 /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb 파일을 직접 편집하기 시작했습니다:

class SMTP
  attr_accessor :settings

  DEFAULTS = {
    :address              => 'smtp-relay.gmail.com',
    :port                 => 587,
    :domain               => 'mydomain.com',
    :user_name            => 'user@mydomain.com',
    :password             => 'mypass',
    :authentication       => 'login',
    :enable_starttls      => nil,
    :enable_starttls_auto => true,
    :openssl_verify_mode  => 'peer',
    :ssl                  => nil,
    :tls                  => nil,
    :open_timeout         => 25,
    :read_timeout         => 25
  }

  def initialize(values)
    self.settings = DEFAULTS #.merge(values)
  end

이것은 위에서 언급한 것과 동일한 동작을 보입니다(커스터마이즈된 app.yml 설정이 주어졌을 때).

도움 요청

이제 막혀 있습니다. 물론 나머지 설정들을 더 조정해 볼 수 있고 (discourse에서 비추천하는 SSL 전용 사용으로 되돌리는 것도 가능하지만), 저는 다음과 같이 하고 싶습니다:

  1. 이 문제를 더 깊이 있게 분석하고 조사하는 방법을 배우는 것
  2. 이를 통해 실제로 무슨 일이 일어나고 있는지, 그리고 문제가 무엇인지 이해하는 것
  3. 문제를 수정하고 모든 것을 원활하게 사용할 수 있게 되는 것 (+마침내 포럼이 제대로 작동하게 만드는 것)

미리 도움을 주셔서 감사합니다.

push*
어떤 아이디어나 제안이 있으신가요?

이 문제가 해결되었나요? 정확히 이 작업을 해보려 하는데, 이 글을 보고 걱정되고 있습니다.

Gmail에 대해서는 확실하지 않지만, Zoho는 작동하지 않으며, 제가 관리에 참여했던 이커머스 사이트에서는 Outlook도 작동을 멈췄습니다.

이미 상당한 기간 동안 Mailersend 같은 트랜잭션 이메일 서비스를 사용하는 것이 모범 사례였지만, 시간이 지날수록 필수 요구사항이 되어가고 있습니다.

수정하여 명확히 하자면: 이는 이메일 제공자 측의 차단이며, Discourse나 서버 측에서 수정할 수 있는 문제가 아닙니다. 대부분의 제공자는 트랜잭션 이메일을 보내기 위해 SMTP를 사용하는 것을 더 이상 지원하지 않습니다. (혹은 공식적으로 지원한 적도 없었을 것입니다.)