우당탕탕

AWS SES로 이메일 발송 구현하며 막힌 2026년 변화와 해결법 본문

Tech/AWS

AWS SES로 이메일 발송 구현하며 막힌 2026년 변화와 해결법

모찌모찝 2026. 6. 6. 11:22

AWS SES(Simple Email Service)로 이메일 발송 기능을 직접 구현하다 보니, 생각보다 삽질이 많았어요. 특히 2026년 들어서 SES 정책과 설정에 변화가 생기면서 예전 방식으로 세팅하면 오류가 나는 경우가 자주 있더라고요.

이번 글에서는 제가 직접 AWS SES를 2026년 최신 정책에 맞춰 세팅하고, 서버에서 이메일을 발송하기까지 겪었던 이슈들 그리고 해결 방법을 꼼꼼히 정리해봤습니다. 특히 예전과 달라진 점 위주로 설명해서, SES로 이메일 발송 처음 하는 분이나 작년 자료 참고하다 막힌 분들께 딱 도움이 될 거예요.

개발 환경 / 버전 정보

2026년 6월 기준 AWS CLI v2.14.0, AWS SDK for JavaScript v3를 사용했어요. SES는 ap-northeast-2(서울 리전)에서 테스트했습니다.

SES 기본 세팅, 그런데 여기서 많이 틀립니다

작년까지는 SES 콘솔에서 바로 도메인 인증하고, 바로 이메일 보낼 수 있었는데요. 2026년 들어 AWS가 SES 정책을 강화하면서 '신원 인증(Identity Verification)' 과정이 더 엄격해졌으니 꼭 확인하세요.

  • 도메인 뿐 아니라, 발신용 이메일 주소나 도메인 자체에 대해 별도의 '검증 레벨'을 맞춰야 합니다.
  • 2026년부터는 SES 콘솔에서 새로운 '신원 유형' 메뉴가 도입됐고, 여기서 도메인과 이메일주소를 각각 재검증해야 발송 권한이 활성화됩니다.
  • 스팸 방지를 위한 '발신자 정책 프레임워크(SPF)', '도메인키 식별메일(DKIM)' 설정이 필수로 바뀌었습니다.

그래서 저는 먼저 AWS CLI로 인증 상태를 확인했는데, 콘솔과 결과가 다르게 나와서 한참 헤맸어요.

# 도메인 인증 상태 확인
aws ses get-identity-verification-attributes --identities example.com --region ap-northeast-2
{
    "VerificationAttributes": {
        "example.com": {
            "VerificationStatus": "Success"
        }
    }
}

# 이메일 주소 인증 상태 확인
aws ses get-identity-verification-attributes --identities sender@example.com --region ap-northeast-2
{
    "VerificationAttributes": {
        "sender@example.com": {
            "VerificationStatus": "Pending"
        }
    }
}

이처럼 도메인은 인증됐는데, 발신 이메일 주소는 아직 'Pending' 상태라서 실제로 이메일 보내면 "MessageRejected" 에러가 뜨더라고요.

실제 발송 구현, 나는 이렇게 했어요

저는 Node.js 환경에서 AWS SDK v3를 이용해 SES를 호출해서 이메일을 발송했는데요. 다음은 작동하는 최소한의 예제 코드입니다.

import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";

// 서울 리전 SES 클라이언트 생성
const sesClient = new SESClient({ region: "ap-northeast-2" });

async function sendEmail() {
  const params = {
    Destination: {
      ToAddresses: ["recipient@example.com"],
    },
    Message: {
      Body: {
        Text: { Data: "안녕하세요, AWS SES 테스트 메일입니다." },
      },
      Subject: { Data: "테스트 메일 제목" },
    },
    Source: "sender@example.com", // 반드시 인증된 이메일 주소여야 함
  };

  try {
    const command = new SendEmailCommand(params);
    const response = await sesClient.send(command);
    console.log("메일 전송 성공", response);
  } catch (error) {
    console.error("메일 전송 실패", error);
  }
}

sendEmail();

여기서 중요한 건 Source에 반드시 인증된 이메일 주소를 넣어야 한다는 점이에요. 도메인만 인증했다고 해서 아무 이메일로 보낼 수 있는 게 아니라 발신용 주소도 꼭 검증해야 하더라고요.

처음 막혔던 'MessageRejected' 에러는 이렇게 해결했습니다

"MessageRejected: Email address is not verified"라는 오류가 한참 뜨는데, 이게 발신자 주소 인증이 제대로 완료되지 않아서였어요. AWS SES 정책이 바뀐 거라 할 수 있는데, 한 번은 도메인 인증했으니 이메일 주소 검증은 안 해도 된다고 생각했던 게 문제였죠.

AWS CLI 명령어로 인증 이메일 재전송하고, 발신자 메일함에서 링크 눌러 재인증 절차를 거치니 바로 전송 가능해졌어요.

# 인증 이메일 재전송 명령어
aws ses verify-email-identity --email-address sender@example.com --region ap-northeast-2

SPF와 DKIM 설정, 안 하면 2026년에 진짜 문제됩니다

이 부분에서 많이들 헷갈려하시는데, 2026년부터 SES에서 SPF, DKIM 설정이 없으면 대부분 이메일이 스팸함으로 직행하거나 발송 자체가 막혀요.

제가 쓴 도메인 DNS 관리 콘솔에서 다음과 같이 TXT 레코드와 CNAME 레코드를 추가했어요.

  • SPF (TXT): v=spf1 include:amazonses.com ~all
  • DKIM (CNAME): SES 콘솔에서 제공하는 3개의 CNAME 레코드 입력

이 설정을 안 하면 다음과 같은 Bounce 알림이 자주 와요.

Reporting-MTA: dns; a27-31.smtp-out.amazonses.com
Action: failed
Status: 550 5.7.1 Message rejected due to DMARC policy

여기서 삽질했던 부분들

aws ses send-email 명령어로 테스트 발송하던 중, 자꾸 "AccessDenied" 에러가 났어요. IAM 정책 문제라 한참 헤맸는데, 2026년부터 SES 관련 권한 정책이 더 세분화되어서 이전처럼 포괄적인 권한만 주면 안 되더라고요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ses:SendEmail",
        "ses:SendRawEmail"
      ],
      "Resource": "*"
    }
  ]
}

이 정책으로도 안 되길래 AWS 문서 보니, 2026년부터는 리전 별 세부 액션과 조건을 따로 명시해야 하더라고요. 저는 다음처럼 바꿔서 해결했습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ses:SendEmail",
        "ses:SendRawEmail"
      ],
      "Resource": "arn:aws:ses:ap-northeast-2:123456789012:identity/example.com"
    }
  ]
}

특히 Resource에 리전과 어카운트 아이디, 그리고 인증한 도메인 이름을 명확히 지정하는 게 중요해요.

심화: 발송 속도 제한과 Sandbox 모드

사실 이 부분이 AWS SES 처음 쓰는 분들이 가장 헷갈려하는데, 계정이 기본적으로 Sandbox 모드에 잡혀 있어서 제한 걸리는 게 많거든요. 2026년 정책도 다소 강화되어서, 발송량 증가 신청을 안 하면 여전히 매일 최대 200건 정도만 발송 가능합니다.

Sandbox 모드에서는 인증되지 않은 이메일 주소로는 절대 못 보내고, 수신자도 직접 등록해야 해서 테스트할 땐 꼭 이 점 염두에 두셔야 합니다.

발송 제한 해제 신청은 AWS Support에서 "SES Production Access" 요청해야 하고, 요청서에 발송 목적과 콘텐츠 검수 정보를 적어야 하니 미리 준비해두세요.

자주 물어보시는 것들

Q. 2026년부터 SES 콘솔 UI가 크게 바뀌었는데 예전 가이드 봐도 괜찮나요?

A. 안타깝지만 예전 UI 기반 가이드들은 인증 절차와 권한 부여 방식이 달라졌기 때문에 참고만 하시고, 꼭 최신 공식 문서 및 콘솔에서 확인하세요.

Q. AWS SDK v2 대신 v3로 꼭 바꿔야 할까요?

A. v3가 가볍고 모듈화 잘돼 있어서 신규 프로젝트엔 추천합니다. 하지만 당장 급하지 않으면 v2 쓰셔도 무방해요. 다만 최신 정책 반영은 v3 문서가 더 빠릅니다.

Q. SES 말고 다른 AWS 서비스로 이메일 보내는 게 좋을까요?

A. SES가 비용 효율적이고 AWS 내 연동이 편리해서 추천하지만, 마케팅 이메일 같은 대량 발송엔 AWS Pinpoint 같은 서비스가 더 적합할 수 있습니다.

Comments