Infra/Cloud

Amazon SES 사용하여 메일 보내기 (1) - SES란?

DuL2 2024. 1. 14. 01:06

Amazon SES를 통해 메일보내기 시리즈

  1. Amazon SES 사용하여 메일 보내기 (1) - SES란? - 현재글
  2. Amazon SES 사용하여 메일 보내기 (2) - 아마존 SES 설정
  3. Amazon SES 사용하여 메일 보내기 (3) - 이메일 인증 기능 with Spring & AWS SDK for Kotlin

 

아마존 SES는 사용자의 이메일 주소와 도메인을 이용해 이메일을 보내고 받기 위한 쉬운 기능을 제공하는 서비스이다.

 

필자가 이메일 인증 구현을 프로젝트로 진행할 때는 유명 검색엔진 메일 서버의 SMTP 설정을 사용해 기능을 구현했었는데 현업에서는 클라우드의 메일 서비스를 사용한다고 하기에 기능을 구현하고자 공부를 위해 정리하고자 한다.

 

이 글에서는 아마존 SES에 대해 공부해보고 정리하는 시간을 가지며 이어질 글들에서는 SES를 이용한 이메일 인증 기능을 구현해보려고 한다.

Amazon Simple Email Service(SES)

아마존 SES의 주요 사용 용도는 특별 행사 안내 등의 마케팅 이메일, 주문 확인서 등의 거래 이메일, 뉴스레터 등의 기타 통신문을 발송하는데 쓰이며 SES를 통해 메일 수신시 자동 응답기, 이메일 구독 해제 시스템, 수신 이메일에서 고객 지원 티켓 생성하는 애플리케이션 등을 제작할 수 있다고 한다.

 

 장점으로는 당연히 대규모 이메일 솔루션을 직접 구축하는 것보다 손이 덜가며 비용적으로도 이득을 볼 수 있다고 설명한다. 솔루션을 가지고 있지 않은 회사는 초기에 많은 비용이 필요하므로 SES를 통해 쉬운 메일 관련 서비스를 구축할 수 있다고 한다.

 

 개인 또는 기업용 이메일(domain이 일반 웹서비스와 다른)에서 직접 메일 서버를 구축해 사용하게 되면 외부로 메일을 보낼때 검증이 되지 않아 일부 메일에서 스팸메일로 빠지는 등의 예상치 못한 오류가 발생한다. 하지만, 아마존 SES는 해당 오류를 DKIM 인증을 통해 진행을 해주며 매우 저렴한 금액으로 사용할 수 있다. 또한 서버 구축 또는 비동기 처리를 하지 않고 AWS에 request만 보내면 간단하게 처리가 가능하다.

 

이메일 서비스 공급자 - Amazon Simple Email Service(SES) - Amazon Web Services

Amazon Simple Email Service(Amazon SES)를 사용하면 Simple Mail Transfer Protocol(SMTP) 이메일 서버를 온프레미스에 유지하지 않고도 Amazon SES API 또는 SMTP 인터페이스를 사용하여 고객과 안전하게 소통할 수 있습

aws.amazon.com

아마존 프리티어 서비스 한도

보통 취준생 및 개발을 공부하시는 분들은 아마존 프리티어를 사용할 것으로 생각되어 아마존에서 매월 제공하는 프리티어의 메일 메세지 처리 건수와 비용 정책을 첨부한다.

프리 티어 고객은 SES 사용을 시작한 후 처음 12개월간 매달 최대 3,000건의 메시지무료로 수신할 수 있습니다. 
다음과 같은 SES 제품의 메시지 요금은 SES 프리 티어에 해당됩니다. 

 - 아웃바운드
 - 이메일인바운드
 - 이메일가상 배달 가능성 관리자 아웃바운드 이메일 처리

이메일 1건 전송은 메시지 요금 1건과 동일하며, 이메일 1개 수신도 메시지 요금 1건으로 계산됩니다. 계정에 대해 가상 배달 가능성 관리자를 활성화하는 경우 이메일 1건 전송은 메시지 요금 2건으로 계산됩니다. 예를 들어, 고객은 가상 배달 가능성 관리자를 활성화한 상태에서 월 1,000건의 메시지를 전송할 수 있으며(메시지 요금 2,000건) 수정된 SES 프리 티어 한도인 메시지 요금 3,000건을 초과하지 않고 1,000건의 이메일(메시지 요금 1,000건)을 수신할 수 있습니다. 이 블로그 게시물에서 더 많은 예를 확인할 수 있습니다.

이메일 전송 할당량

다음 할당량은 Amazon SES를 통해 이메일을 보낼 때 적용된다.

전송 할당량

할당량은 메시지 수가 아니라 수신자 수를 기준으로 한다.

메시지 할당량

 

이외 할당량 정보는 이 링크에서.. : 아마존 SES 할당량

 

샌드박스

도용 및 침해를 방지하기 위해서 맨 처음 구성된 제약이 있는 환경을 말한다.

  • 인증된 메일에만 발송하는 규칙이 있음
  • 하루에 200건까지만 발송 가능
  • 1초에 1건만 발송 가능

실제 운영 서비스에 SES를 본격적으로 적용하려면 SANDBOX 해제가 필요하다.

→ 정상적인 메일 발송을 하기 위해서는 SANDBOX해제 필요(참고)24시간 내(혹은 4일 정도 걸린다는 말도 있었다.) 회신된다.
참고된 링크처럼 SANDBOX만 해제를 할 수도 있지만 일일전송량, 초당 전송량 limit을 수정하면서 SANDBOX해제를 동시에 요청 할 수도 있다.

추가로, support에서 description작성시 요구한 질문에 대한 답변이 없으면 요청이 거부된다!

Amozon SES 를 통한 이메일 전송 작동 방식

  1. 이메일 발신자 역할을 담당하는 클라이언트 애플리케이션(즉 내가 개발하는 서버)이 SES에 하나 이상의 수신자에게 이메일을 전송하는 요청을 한다.
  2. 요청이 유효하면 SES가 이메일을 수락한다.
  3. SES는 인터넷을 통해 수신자의 수신 장치에 메시지를 보낸다. SES로 전달된 메시지는 일반적으로 즉시 전송되며 통상적으로 최초 배달 시도가 몇 밀리초 이내에 이루어진다.
  4. 이 시점에서 통상적으로 세 가지의 경우의 수가 존재한다.
    1. ISP가 성공적으로 메시지를 수신자의 받은 편지함으로 전송하는 경우.
    2. 수신자가 존재하지 않아 ISP가 SES에게 반송 알림을 전송하고 SES가 다시 그 알림을 발신자에게 전달.
    3. 수신자가 발신자를 스팸으로 여겨 ISP에게 수신 거부를 제기하고 이 또한 다시 SES를 통해 이 응답을 발신자에게 전달.

발신자가 SES로 이메일 요청을 보낸 후

이메일을 보냈을 때 성공 및 실패 여부에 따라 달라지는 분기 상황에 대해서 정리해본다.

전송 요청 성공

 SES에 대한 요청이 성공하면 SES가 발신자에게 성공 응답을 반환한다. 이 메세지에는 요청을 고유하게 식별하는 문자열인 메시지 ID가 포함된다. 우리는 이 메세지 ID를 사용하여 전송된 이메일을 식별하거나 전송 중에 발생된 문제들을 확인할 수 있다. 그런 다음 SES가 요청 파라미터를 기반으로 이메일 메시지를 받아 메시지에서 의심스러운 콘텐츠 및 바이러스를 검사한 다음 SMTP를 이용해 수신자들에게 보낸다. 메세지는 통상적으로 최초 전송 시도가 몇 밀리초 이내에 이루어진다

- 참고 -
만약 SES가 우리의 메세지에서 바이러스를 확인하면 해당 메시지 처리를 중지하고 해당 메시지를 수신자의 메일 서버로 전송하지 않는다.

전송 요청 실패

 발신자가 SES로 보낸 이메일 전송 요청이 실패할 경우 SES가 발신자에게 오류를 반환하고 이메일을 거부한다. 요청이 실패하는 원인은 여러 가지가 잇을 수 있다. 예를 들어 요청이 적절한 형식이 아니거나 발신자가 이메일 주소를 확인하지 않았을 수 있다.

 

사용자가 요청 실패 여부를 확인할 수 있는 방법은 SES를 호출한 방법에 따라 다른다. 다음 예제를 통해 오류 및 예외가 반환되는 방식을 알아보자. 

  • 쿼리(HTTPS) API(SendEmail 또는 SendRawEmail)를 통해 SES를 호출하는 경우 작업이 오류를 반환한다.
  • 예외를 사용하는 언어로 AWS SDK를 사용하는 경우 SES 호출이 MessageRejectedException을 발생시킬 수 있다.(예외의 이름은 SDK에 따라 약간 다를 수 있음.)
  • SMTP 인터페이스를 이용하는 경우 발신자가 SMTP 응답 코드를 수신하지만, 오류가 전달되는 방식은 발신자의 클라이언트에 따라 달라진다. 클라이언트에 따라 오류코드가 표시될 수도, 표시되지 않을 수도 있다.

SES를 통해 이메일을 전송할 때 발생할 수 잇는 오류에 대한 자세한 내용은 이곳을 참조하자.

 

Amazon SES가 이메일을 전송한 후

발신자가 SES로 보낸 요청이 성공하면 SES가 이메일을 전송하고 다음중 하나의 결과가 발생한다.

  • 이메일이 성공적으로 배달되고 수신자가 이메일을 거부하지 않음 ISP가 이메일을 수락하고 ISP가 이메일을 수신자에게 배달한다.

  • 하드 바운스 영구적 조건으로 인해 ISP가 거부했거나 이메일 주소가 SES 금지 목록에 있어 SES가 거부한 이메일이다. SES 금지 목록에는 최근 SES 고객에게 하드 바운스를 발생시킨 이메일 주소가 들어 있다. ISP에서의 하드 바운스는 수신자 주소가 유효하지 않기 때문에 발생할 수 있다. 하드 바운스 알림은 ISP에서 SES로 다시 전송되고, SES는 발신자의 설정에 따라 이메일 또는 Amazon Simple Notification Service(Amazon SNS)를 통해 발신자에게 이를 알린다. SES는 동일한 방법으로 발신자에게 금지 목록 반송 메일 알림을 전송한다.
    • 즉, 예를 들어 SKT의 이메일 거부 목록 중에 우리 수신자의 이메일이 들어있거나 수신자의 주소가 유효하지 않은 경우 하드 바운스를 일으킴.

  • 소프트 바운스 ISP는 일시적 상태(예: ISP가 처리할 요청이 너무 많거나 수신자의 메일박스가 가득 차 있음)로 인해 수신자에게 이메일을 전송하지 못할 수 있다. 도메인이 존재하지 않는 경우에도 소프트 바운스가 발생할 수 있다. ISP는 SES로 소프트 바운스 알림을 다시 전송한다. 또는 도메인이 없는 경우 SES가 해당 도메인의 이메일 서버를 찾을 수 없다. 두 경우 모두 SES는 이메일 전송을 장시간 재시도한다. SES가 재시도에서도 이메일을 전송할 수 없는 경우에는 이메일 또는 Amazon SNS를 통해 반송 메일 알림을 전송한다. 재시도에서 SES가 수신자에게 이메일을 배달할 수 있으면 배달은 성공이다. 아래 그림 경우, SES가 이메일 전송을 재시도하여, 결국 ISP가 수신자에게 이메일을 배달하는 경우이다.
    • 요약하자면 ISP 메일박스가 바쁘거나 우리가 보내야하는 수신자의 도메인이 없거나 하면 SES에서 몇번의 재시도를 하다가 성공하면 성공처리, 실패하면 반송 알림을 우리에게 준다.

  • 수신 거부 ISP가 수락하여 수신자에게 배달되었지만 수신자가 이 이메일을 스팸으로 간주하여 이메일 클라이언트에서 ‘스팸으로 표시’와 같은 버튼을 클릭한 이메일이다. SES에 ISP와의 피드백 루프가 설정되어 있는 경우, 수신 거부 알림이 SES에 전송되고 SES는 이 수신 거부 알림을 발신자에게 전달한다. 대부분의 ISP가 수신 거부를 제출한 수신자의 이메일 주소를 제공하지 않으므로, SES가 전달하는 수신 거부 알림은 원래 메시지의 수신자 그리고 SES에 수신 거부를 보낸 ISP를 기준으로 수신 거부를 제출했을 수 있는 수신자의 목록을 발신자에게 제공한다.
    • 우리 도메인이 스팸일 경우 발생. SES는 확정으로 알려주는 것이 아닌 확률을 말해줌.

  • 자동 응답 이 이메일은 ISP가 수락하여 수신자에게 배달한 이메일이다. 그런 다음 ISP가 부재중(OOTO) 메시지와 같은 자동 응답을 SES로 전송한다. 그러면 SES가 자동 응답 알림을 발신자에게 전달한다. 자동 응답을 생성하는 메시지는 SES 지원 프로그램이 전송을 재시도하지 않도록 하는게 좋다. 

 

마무리.

이 글에서는 SES를 통해 이메일 인증 기능을 개발해보기 위해 아마존 SES를 이해해보며 간단하게 정리를 했습니다. 다음 글에서는 SES를 설정하고 우리의 도메인과 연결하는 것을 확인해 보자.