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

저는 @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. 문제를 수정하고 모든 것을 원활하게 사용할 수 있게 되는 것 (+마침내 포럼이 제대로 작동하게 만드는 것)

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