온프레미스 환경을 클라우드 환경으로 이관하는 작업을 받아서 하는 중, sendmail을 통해 메일을 보내는 기능도 있다는 것을 확인했다.
메일 전송을 사용자의 계정 패스워드 찾기, 회원가입시 welcome 메일 전송 등에 이용하고 있었다.
이 부분도 그냥 다른 작업과 마찬가지로 ec2에 sendmail 설치 후 설정만 해주면 온프레미스 환경과 동일하게 사용할 수 있을것이라고 생각했었다.
※ EC2의 25번 포트 block
AWS에서는 EC2, Lightsail을 비롯한 컴퓨팅 서비스에 대해 아웃바운드 트래픽에 대해 25번 포트의 사용을 제한하고 있다.
25번 포트 이외의 메일 포트인 465나 587을 사용하는 방법도 있지만, 25번 포트를 사용하기 위해서는 아래 AWS 가이드 대로 AWS 측으로 요청을 보내야한다.
25번 포트 오픈 요청은 AWS 측에서 까다롭게 내용을 검증해서 허가를 잘 내주지 않는다는 내용도 있고, 다른 포트를 이용하는 방법도 좋긴하지만 찾아보고 설정하기 귀찮기도 하고, 이왕 AWS 쓰는김에 자체 제공해주는 서비스를 이용해보자라는 의미에서 그 당시에는 SES를 이용하기로 했었다.
SES
Simple Email Service, AWS측에서 제공하는 이메일 솔루션 서비스로 사용자의 도메인을 이용해 이메일을 주고받을수 있다.
메일서버를 구축하고 관리하는 등의 비용을 크게 줄일 수 있다.
SES를 사용하기 위한 절차는 다음과 같다.
1. 사용하고자 하는 도메인을 등록
2. Sandbox를 벗어나는 작업만 진행
3. SMTP Credential을 생성
4. 서비스에 SMTP Credential을 등록해 사용
Sandbox?
도용 등의 방지를 위해 도메인 검증 후의 안전장치 개념의 환경으로, Sandbox에서는 SES에 등록된 이메일주소와 도메인으로만 메일의 발송이 가능하다.
기본적으로 모든 AWS 계정은 Sandbox에 있으며, Sandbox에서 나가기위한 요청을 AWS측에 해주고 허가를 받아야 Sandbox에서 나갈 수 있다.
또한, Sandbox에 있을때에는 24시간 당 200건의 메일과 초당 1건의 전송의 제한이 존재한다.
In Sandbox | Out of Sandbox |
SES에 등록된 이메일 주소와 도메인으로만 메일의 발송이 가능 | 제한없이 메일의 발송이 가능 |
24시간 당 200건의 메일 전송량, 초당 1건의 전송 속도 | 24시간 당 50000건의 메일 전송량, 초당 14건의 전송 속도 |
SES 구성
1. 사용할 도메인 등록
SES > 확인된 자격 증명에서 자격 증명(identity) 생성
(2022.10월 쯤 이후로 SES 서비스의 한글화 및 기능 추가 등이 이루어지고 있음을 볼 수 있었다. 앞으로 더 좋은 기능이 나왔으면...)
자격 증명(identity)
SES를 통해 메일을 송신할 때에 송신자로 사용할 객체, identity를 생성함에 따라 해당 identity가 본인의 소유임을 증명하는 기능을 포함한다.
도메인 단위와 이메일 주소 단위 중에서 선택 가능하며 도메인 단위로 생성한 경우 해당 도메인의 모든 이메일 주소가 확인되어 해당 도메인의 개별 이메일들의 자격증명 생성작업을 해주지 않아도 된다.
자격증명(identity)를 생성한다. 입력란 하단의 기본 구성 세트, MAIL FROM은 일단 설정하지 않고 넘어간다.
도메인 identity 생성의 경우 DKIM이라고 하는 도메인 확인 절차가 추가로 존재하는데, SES에서 요구하는 몇개의 확인용 CNAME 레코드를 생성해서 소유권을 확인하는 절차이다.
이 부분은 해당 도메인이 Route53에 등록되어있는 경우 자동으로 설정을 해준다.
생성하는 경우 아래와 같이 3개의 CNAME 레코드와 값이 생성되고, 이를 바탕으로 해당 도메인의 레코드로 생성해주면 인증이 된다.
인증 후 확인을 위해 테스트 이메일을 전송할 수 있다.
전송 형식을 지정해 전송 성공/반송/수신 거부 등의 시나리오를 확인 할 수 있다.
2. Sandbox 탈출
SES 사용을 위한 identity를 생성하고 테스트 이메일까지 확인 후, 실제 사용을 하기 위해 Sandbox 탈출을 해야한다.
이 Sandbox는 각 리전 별로 분리가 되어있어 다른리전에서도 SES를 사용하고자 하는 경우, 그 리전의 Sandbox 해지를 별도로 해주어야 한다.
SES계정이 Sandbox에 있는 경우 계정 대시보드를 확인했을때 다음과 같은 경고가 존재한다.
Sandbox 해지를 위해 AWS에 요청하기 위한 양식에 맞게 작성해주자, 한글로 적는 경우 처리를 해주지 않는다고 하는 내용이 일부 보였다. 빠른 처리를 위해 영어로 작성하자
(아마 한글 요청도 받을거같긴한데, 어지간하면 영어로 작성하자. 대충 내용만 전달되면 되기 때문에 그냥 파파고 돌려도 그만이다.)
- 메일 유형 : 전송할 메일의 타입, 마케팅을 선택하는 경우 아래 사례설명을 상세하게 적을 필요가 있을 듯하다. 회원의 패스워드 초기화, 가입 welcome 등의 메일은 트랜젝션을 선택하자
- 웹 사이트 URL : 웹 서비스가 있는 경우, 도메인을 적어준다. 크게 필수인 부분은 아니다.
- 사용 사례 설명 : SES를 통해 어떻게 서비스 운영을 할 것인지 등을 적는 구간, 크게 3가지 내용만 담기면 된다고 한다.
- 메일 발송 목록을 어떻게 만들거나 획득할 계획입니까?
- 반송과 수신 거부를 어떻게 처리할 계획입니까?
- 수신자가 이메일 수신을 옵트아웃하려면 어떻게 해야 합니까?
- 추가 연락처 : 이 요청을 보내는 경우, 요청의 내용과 처리결과를 받을 수 있는 이메일을 적는 구간, 따로 적지 않는 경우 Root 계정의 이메일로만 전송된다.
- 선호하는 연락 언어 : 영어나 일본어 중 선택
필자는 당시 요청을 넣었을때 사용 사례를 다음과 같이 적었다.
Q. 메일 발송 목록을 어떻게 만들고 관리?
A. 한국의 개인정보 보호법에 따라, 회원가입 당시 수신메일 수집 동의를 받아 수집된다.
Q. 반송/수신 거부 처리를 어떻게?
A. 시스템 관리자가 반송된 이유를 확인한 후 반송된 메일이 변경되거나 삭제됩니다. 사용자의 수신거부는 관리자 이메일, 게시판, 전화 등을 통해 처리된다.
Q. 수신자가 이메일 수신을 거부했을때 어떻게 처리하는가?
A. 수신 거부는 서버 측 코드에서도 구현되며, 수신이 거부된 구성원은 메일을 발송하지 않도록 데이터베이스에 저장됩니다.
3. SMTP Credential 생성 및 실사용
SES > SMTP 설정, 사용할 SMTP 엔드포인트와 포트 정보를 알려준다. 'SMTP 보안인증 생성' 으로 Credential 생성과정으로 넘어가자
이렇게 SMTP 엔드포인트에 접근할 계정을 생성했다.
이제 이 계정을 바탕으로 실제 메일을 전송해보자, 간단하게 phpMailer를 이용해 전송해보았다.