Amazon AWS SES에서 SMTP를 통해 이메일 전송 문제 해결

SendGrid에서 Amazon SES로 전환하는 데 문제가 있습니다.

app.yml 설정을 공유해 주시거나, 제 설정이 올바른지 확인해 주실 수 있을까요?

  ## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
  DISCOURSE_SMTP_ADDRESS: email-smtp.eu-west-2.amazonaws.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: xxxxxxx
  DISCOURSE_SMTP_PASSWORD: "xxxxxxxxxx"
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값 true)
  DISCOURSE_SMTP_AUTHENTICATION: login

여기서 인증 파라미터가 올바른가요?

무엇을 놓친 부분이 있을까요?

도메인이 SES에서 인증되어 있으므로 SMTP 인증 매개변수는 필요하지 않습니다.

또한, 아직 샌드박스에서 해제하지 않았다면 SES 계정을 샌드박스에서 해제하고 한도 증대를 요청해야 할 수 있습니다. 샌드박스 조건은 리전별로 적용됩니다.

네, 도메인이 인증되었는지 확인했고, 운영 모드이며 속도 제한이 증가되었음을 확인했습니다.

나머지는 모두 정상인가요? :thinking:

네, 다른 설정들은 제게도 올바르게 보입니다.

그리고 비밀번호가 "marks"로 감싸져 있는 것이 괜찮은가요?

네, 그건 괜찮을 것 같아요

음…

명령줄에서 테스트할 방법이 있을까요?

저도 매번 앱을 다시 빌드했습니다.

빠른 답변 감사합니다 :+1:t2:

그리고 이것도 올바른가요? (제안하신 대로 인증 라인을 주석 처리했습니다)

AWS SES를 통해 이메일이 전송되지 않는 이유를 여전히 알 수 없습니다.

Discourse 관리 페이지에서 테스트 이메일을 보내면 단순히 '전송됨’이라고 표시될 뿐입니다. 비밀번호를 잊었을 때 재설정 요청을 시도해도 절차는 정상적으로 진행되지만, 이메일은 전혀 도착하지 않습니다.

SES는 로그를 남기지 않는 것 같아서, 이메일이 실제로 수신되고 있는지 확인조차 할 수 없습니다.

문제를 일으킬 수 있는 유일한 부분은, 회신 주소에 우리 사이트 도메인 대신 gmail.com 계정을 사용하고 있다는 점입니다.

이 조합/시나리오를 경험해 보신 분이 계신가요?

이것은 발신자(from) 라인에 표시될 이메일 주소입니다. SES가 메일을 발송하는 도메인의 주소여야 합니다. SES는 gmail에서 온 것처럼 가장한 메일을 발송하지 않습니다. gmail.com에 대한 제어 권한이 없으므로, SES는 발신자 라인에 gmail.com이 포함된 메일을 발송하지 않습니다. notification_email은 something@yourverifieddomain으로 설정해야 합니다.

혹시 그런 것일 수도 있겠다는 생각이 들었습니다.

현재 사용 중인 SendGrid 설정은 수년간 잘 작동해 왔으며, 다음과 같은 구성을 가지고 있습니다:

답장 주소가 gmail.com 도메인에 있기 때문에, 제가 하려는 작업은 SES에서는 단순히 불가능하다는 말씀이신가요?

알림 이메일은 발신인(from) 항목에 표시되는 내용이며, 네, 그게 문제일 가능성이 꽤 높다고 생각해요. 변경해 보셨나요?

저도 SES를 사용하는데 잘 작동합니다. 비교했을 때 제가 볼 수 있는 유일한 차이는 제 설정에 DISCOURSE_SMTP_AUTHENTICATION: login 라인이 없다는 점입니다. 또한 DISCOURSE_SMTP_ENABLE_START_TLS: true와 DISCOURSE_SMTP_PORT: 587은 모두 주석 처리되어 있지만, 이는 차이를 만들지 않아야 합니다.

app.yml에서 제가 수정하는 3개 라인만 SMTP 주소, 사용자 이름, 비밀번호입니다. 나머지는 신규 설치 시 기본값 그대로 주석 처리되어 있습니다. 재빌드 후에는 사이트 설정의 notification email이 SES에서 인증된 도메인을 사용하는 주소로 설정되어 있는지 확인하면 됩니다. 더 이상 비밀번호에 따옴표를 사용하지 않지만, 이전 설치에서는 따옴표를 사용했고 어느 쪽이든 문제없이 작동했습니다.

위 답변에서 권장했듯이, 제대로 전송되는지 테스트하기 위해 회신(reply-to) 주소를 인증된 SES 도메인을 사용하는 주소로 변경해 보는 것이 가치가 있을 것입니다.

작동하지 않는다면, 호스트가 일부 포트를 차단하고 있는지 확인하고 SES 자격 증명이 올바르게 생성되었는지 다시 한번 확인해 보시기 바랍니다. 위에서 도메인이 SES로 인증되었음을 확인하셨다는 것을 알고 있습니다.

@markersocial :+1:t2: 자세한 정보 감사합니다!

한 가지만 여쭤봐도 될까요? “답장” 이메일 주소가 “보낸 사람” 주소와 도메인이 다른 건가요? :thinking:

걱정 마세요 :slight_smile:

답장 주소를 보내기 주소와 같은 도메인으로 설정해 두었긴 하지만, 경우에 따라 서브도메인은 다를 수 있어요(그래도 루트 도메인은 동일합니다). 두 경우 모두 제 환경에서는 잘 작동합니다.

이 부분은 확인하셨을 것 같습니다 → Discourse가 메일을 보내는 데 사용하는 발신 메일 주소를 검증하셨나요?

만약 notify@yourverifieddomain이라면, SES 콘솔의 ‘Identity Management’ 아래 두 번째 줄로 가서 발신 메일 주소를 추가하고 검증해야 합니다. 이 작업을 완료하기 전까지는 메일이 전혀 발송되지 않습니다.

경보도 울리지 않고 사이렌도 없으며, 그저 메일이 발송되지 않을 뿐입니다.

Gmail을 회신 주소로 사용하는 것은 좋은 방법입니다. 저도 그렇게 했습니다. 하지만 발신(From) 주소와 회신(Reply) 주소가 일치하지 않아서 회원 인증 메일이 스팸으로 차단되는 문제가 발생했습니다.

결국 수신 메일을 Discourse API로 전달하는 간단한 AWS Lambda 함수를 작성했습니다(사용법을 배우는 데 일주일 정도 걸렸습니다). 아주 깔끔한 해결책입니다. POSTIX는 사용하지 않습니다.