우당탕탕
AWS SES로 이메일 발송할 때 제가 겪은 문제와 해결 방법들 본문
AWS SES(Simple Email Service)로 이메일 발송을 구현하다가 이게 생각보다 삽질이 많더라고요. 처음에는 간단하다고 생각했는데, 실제 세팅하면서 막히는 부분이 한두 군데가 아니었어요.
그래서 이 글에서는 제가 직접 AWS SES 신청부터 인증, 그리고 실제 이메일 발송까지 어떤 순서로 했고, 중간에 어디서 막혔는지, 그 문제를 어떻게 해결했는지 단계별로 자세히 적었어요. 화면 설정, 콘솔 메뉴, 명령어 같은 구체적인 내용도 빠뜨리지 않았으니, SES로 메일 보내려는 분들은 이 글 하나면 될 겁니다.
AWS SES 신청부터 인증 완료까지 저는 이렇게 했어요
사실 이 부분이 가장 헷갈리는 단계였는데, 순서대로 따라하면 어렵지 않아요. 먼저 AWS 콘솔에 로그인한 뒤 SES 서비스를 선택합니다.
- SES 콘솔 메뉴 왼쪽에서 ‘Identity Management’ > ‘Domains’ 으로 갑니다.
- ‘Verify a New Domain’ 버튼을 눌러서 인증할 도메인 입력 후 ‘Generate DKIM Settings’ 체크하고 진행해요.
- 그러면 TXT, CNAME 레코드 값들이 나오는데, 이것들을 도메인 DNS에 등록해야 합니다.
저는 여기서 Route53에 등록된 도메인이 있어서 바로 DNS 레코드 추가했는데, 만약 다른 DNS 제공자 쓰면 거기에 맞게 레코드 추가하면 돼요. 이때 꼭 TTL을 너무 길게 안 잡는 게 나중에 빨리 인증받을 때 좋아요.
DNS들이 전파되는 시간도 있고 해서, 바로 SES 콘솔에서 ‘Verify’ 버튼 눌러도 인증 완료까지 시간이 좀 걸리는데, 저는 대략 10~15분 정도 걸렸어요.
그리고 Domain Verified 상태가 되면, ‘DKIM verified’도 자동으로 ‘Success’로 바뀌는지 꼭 확인하세요. DKIM이 제대로 안 되면 스팸 걸릴 위험이 높거든요.
AWS SES로 이메일 발송 구현하면서 겪은 이슈 관련 정보
IAM 사용자 생성과 권한 설정, 저는 이렇게 했어요
이메일 발송 API를 호출할 때 필요한 권한이 있어서 IAM 유저도 따로 만들어야 해요. 저는 다음 단계로 했습니다.
- AWS 콘솔에서 ‘IAM’ 메뉴로 이동.
- ‘Users’ > ‘Add users’ 클릭 후, 사용자 이름 입력하고 ‘Programmatic access’만 체크했어요.
- ‘Attach existing policies directly’를 선택 후, AmazonSESFullAccess 권한을 붙였습니다.
- 다음 단계로 넘어가서 ‘Create user’ 누르면 액세스 키 ID와 시크릿 키가 나오는데 꼭 저장하세요.
저는 처음에 시크릿 키를 저장 안 해서 다시 만들어야 했는데, 이걸 안 하면 API 호출 때 계속 인증 오류가 나니까 꼭 주의하세요.
AWS SES SMTP 크리덴셜 만들고 테스트 메일 보내기
AWS SES는 SMTP 방식과 API 방식 두 가지 방법이 있는데, 저는 우선 간단하게 SMTP로 테스트해봤어요. 절차는 다음과 같습니다.
- SES 콘솔에서 ‘SMTP Settings’ 메뉴 이동 후 ‘Create My SMTP Credentials’ 클릭.
- 새로운 IAM 사용자명 입력 후 생성.
- 생성되면 SMTP 사용자 이름, 비밀번호 받는데, 비밀번호는
openssl명령어로 변환해야 합니다.
저는 macOS 터미널에서 다음 명령으로 변환했어요:
printf "{SMTP_Secret_Access_Key}" | openssl base64
그리고 메일 클라이언트(ex. Thunderbird, Outlook) 또는 swaks 같은 터미널 툴로도 테스트 가능해요. 저는 swaks로 이렇게 테스트했습니다:
swaks --to recipient@example.com \
--from sender@yourdomain.com \
--server email-smtp.us-east-1.amazonaws.com \
--port 587 \
--auth LOGIN \
--auth-user {SMTP_Username} \
--auth-password {SMTP_Password}
이때 가장 많이 막혔던 게 리전(region) 설정이에요. SMTP 서버 주소가 리전마다 다르거든요. 저는 us-east-1 썼는데, SES 콘솔에서 실제 리전 꼭 확인하고 맞춰야 했어요.
AWS SES로 이메일 발송 구현하면서 겪은 이슈 관련 정보
이제는 API로 이메일 보내기, 저의 자바 Spring Boot 예시
사실은 SMTP보다 API 방식이 더 편하고 관리하기 좋다고 해서, Spring Boot에서 AWS SDK v2를 사용해 구현한 코드입니다. 저는 이렇게 했어요.
먼저 build.gradle에 의존성 추가:
implementation 'software.amazon.awssdk:ses:2.20.0'
implementation 'software.amazon.awssdk:sts:2.20.0'
그리고 인증 정보는 보통 ~/.aws/credentials 파일에 저장해두고 SDK가 자동으로 인식하게 했어요.
실제 메일 보내는 코드 예시는 이렇습니다:
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.ses.SesClient;
import software.amazon.awssdk.services.ses.model.*;
public class SesEmailSender {
private final SesClient sesClient;
public SesEmailSender() {
this.sesClient = SesClient.builder()
.region(Region.US_EAST_1) // SES 서비스 리전에 맞게 변경하세요
.build();
}
public void sendEmail(String from, String to, String subject, String bodyText) {
Destination destination = Destination.builder()
.toAddresses(to)
.build();
Content contentSubject = Content.builder()
.data(subject)
.build();
Content contentBody = Content.builder()
.data(bodyText)
.build();
Body body = Body.builder()
.text(contentBody)
.build();
Message message = Message.builder()
.subject(contentSubject)
.body(body)
.build();
SendEmailRequest emailRequest = SendEmailRequest.builder()
.destination(destination)
.message(message)
.source(from)
.build();
try {
sesClient.sendEmail(emailRequest);
System.out.println("이메일이 정상적으로 발송되었습니다.");
} catch (SesException e) {
System.err.println("이메일 발송 실패: " + e.awsErrorDetails().errorMessage());
}
}
}
저는 이걸 서비스에 연결해서 그때그때 이메일을 보내는데, 가장 중요한 건 ‘from’ 이메일 주소가 SES에서 인증받은 도메인의 주소여야 한다는 점이에요. 안 그러면 에러가 납니다.
여기서 많이 틀렸던 점들과 해결 과정
이 부분이 가장 재미있는데, 저도 한참 헤맸던 내용 공유할게요.
- 발송 제한(SES Sandbox): 처음에는 SES가 기본적으로 샌드박스 모드라 인증된 이메일과 도메인 외에는 메일을 못 보내더라고요. 그래서 ‘Request a Sending Limit Increase’ 메뉴에서 프로덕션 모드 신청을 반드시 해야 했어요.
- Region 문제: SDK에서 region 설정을 틀리게 해서 계속 도메인 인증이 안 된 것처럼 에러가 났어요. SES는 보통 us-east-1, us-west-2 등이 있는데, 콘솔과 코드 모두 같은 리전인지 꼭 확인하세요.
- ‘From’ 주소 미인증: 메일 헤더의 발신 주소가 SES 콘솔에서 인증된 도메인 혹은 이메일과 반드시 일치해야 하는데, 그걸 간과해서 ‘Email address not verified’ 에러가 계속 떴어요.
- IAM 권한 부족: API 호출할 때 권한이 없으면 ‘AccessDenied’ 에러가 나는데, 처음에 ‘AmazonSESFullAccess’ 권한을 안 붙여서 몇 번 실패했죠.
이 문제들은 공식 문서와 AWS 포럼 검색하면서 해결했는데, 혹시 여러분도 이런 에러가 뜨면 꼭 하나씩 체크해 보세요.
AWS SES로 이메일 발송 구현하면서 겪은 이슈 관련 정보
심화 꿀팁: 메일 발송 로그 확인과 추가 설정
여기는 제가 나중에 알게 된 팁인데요, 이메일이 제대로 발송됐는지 궁금할 때가 많거든요.
- SES 콘솔의 ‘Sending Statistics’ 메뉴에서 일별 발송 수와 실패 개수 확인 가능.
- CloudWatch와 연동해 메일 발송 실패 이벤트를 알림으로 받을 수도 있어요.
- 스팸 필터링을 줄이려면 SPF 레코드, DKIM, DMARC까지 DNS 세팅해주는 게 좋습니다.
SPF 레코드 예시는 이렇습니다:
v=spf1 include:amazonses.com ~all
저는 이 부분을 빼먹었다가 메일이 스팸함으로 갔던 적이 있어서, 꼭 DNS 세팅 꼼꼼히 하라고 권해 드립니다.
자주 물어보시는 것들, 저도 처음에 헷갈렸어요
Q. AWS SES 무료 사용 한도가 있나요?
A. 네, AWS 계정 생성 후 첫 12개월 동안은 매달 62,000건 이메일 무료입니다. 단, EC2에서 SES로 보낼 때만 무료 적용되고 그 외는 요금 부과될 수 있어요.
Q. Sandbox 모드에서 벗어나려면 어떻게 하나요?
A. SES 콘솔에서 ‘Sending Limits’ 메뉴에 가서 ‘Request a Sending Limit Increase’ 클릭 후, 양식을 작성하는데, 왜 발송하는지, 예상 메일량 등을 적으면 승인 받습니다.
Q. 이메일 HTML 본문을 보내고 싶어요. 어떻게 하나요?
A. SDK에서 Body.builder().html(Content.builder().data(htmlString).build()).build() 처럼 설정하면 됩니다. 텍스트 대신 HTML로 보내고 싶을 때 쓰세요.
제가 AWS SES로 이메일 발송 구현하면서 겪은 이슈들과 그 해결 방법을 최대한 자세히, 단계별로 알려드렸는데요, 결국 중요한 건 도메인 인증, IAM 권한, 지역 설정, 그리고 Sandbox 제한 해제입니다. 이 부분만 잘 체크하면 개발하면서 막히는 문제는 줄어들 거예요. SES는 안정적이고 빠른 이메일 발송 서비스라 꼭 한 번 도전해 보세요!
📌 함께 보면 좋은 글
'Tech > AWS' 카테고리의 다른 글
| AWS IAM 권한 설정 처음 할 때 제가 헷갈렸던 부분과 해결법 (0) | 2026.07.09 |
|---|---|
| AWS RDS와 EC2 MySQL 직접 써보며 결정한 선택 기준과 세팅 절차 (0) | 2026.07.07 |
| AWS API Gateway와 Lambda 서버리스 구축하며 겪은 현실적인 Q&A (0) | 2026.06.22 |
| AWS 비용 예상보다 많이 나왔을 때 원인 찾고 대처한 경험담 (0) | 2026.06.22 |
| AWS Secrets Manager로 DB 비밀번호 관리해보니 꼭 챙겨야 할 체크리스트 (0) | 2026.06.20 |
