UXDL Docs

AWS SES

Verified domains, sending limits, and bounce handling.

Amazon SES is the default production email provider — lowest cost and native AWS integration.

Domain verification

  1. SES Console → Verified identities → Create identity → Domain
  2. Add the DKIM CNAME records to Route 53 (or your DNS provider)
  3. Add SPF record: v=spf1 include:amazonses.com ~all
  4. Enable DKIM signing (3 CNAME records provided by SES)

Environment

dotenv
EMAIL_PROVIDER=ses
EMAIL_FROM=noreply@example.com
AWS_REGION=us-east-1

ECS tasks send via the task IAM role — no API key needed.

IAM policy (task role)

json
{
  "Effect": "Allow",
  "Action": ["ses:SendEmail", "ses:SendRawEmail"],
  "Resource": "*",
  "Condition": {
    "StringEquals": { "ses:FromAddress": "noreply@example.com" }
  }
}

Sandbox vs production

ModeLimitHow to exit
SandboxSend only to verified addressesRequest production access in SES console
Production50,000/day (default, increase via support)Auto after approval

Alpha/Beta environments may stay in sandbox — verify test recipient addresses.

Bounce and complaint handling

Configure SNS topics for bounces and complaints:

  1. SES → Configuration sets → create production
  2. Add event destinations → SNS topics ses-bounces, ses-complaints
  3. Lambda or worker processes SNS events to suppress bad addresses

When to use SES

  • Default for Production transactional email
  • Password resets, invoices, system alerts
  • When cost and AWS-native integration matter

Express implementation

See Email — Backend guide for the SesProvider adapter.

Official documentation