AWS SES Sandbox Mode: Why You Can't Email Customers Yet (And How to Fix It)
You've wired up AWS SES, sent a test email to your own verified address, and everything looks perfect — then you try to email a real customer and hit a wall. This is the SES Sandbox, and understanding why it exists is the first step to getting out of it.
TL;DR
| Aspect | Sandbox Mode | Production Mode |
|---|---|---|
| Recipients | Verified identities only | Any valid email address |
| Sending Limits | Low default quota (check AWS docs for current values) | Higher default quota; can be increased further |
| Use Case | Development & testing | Live application traffic |
| How to Exit | Submit a production access request | N/A — you are already here |
| Bounce/Complaint Handling Required | Recommended | Mandatory for account health |
Why Does the SES Sandbox Exist?
AWS places every new SES account in the Sandbox by default. This is a deliberate trust-building mechanism. Email deliverability is a shared resource — if AWS allowed any new account to immediately blast millions of emails, spammers would abuse the service, damaging IP reputation for every legitimate sender on the platform.
Real-World Analogy: Think of the SES Sandbox like a new driver's learner permit. You can drive, but only under controlled conditions (supervised, restricted routes). Once you demonstrate responsible behavior and pass the test, you get a full license to drive anywhere. AWS needs to see that you understand bounce handling, complaint rates, and responsible sending before granting unrestricted access.
How the Sandbox Restricts You: The Data Flow
The diagram below illustrates exactly where the Sandbox enforcement happens in the SES sending pipeline.
verified identity?"} ModeCheck -- "Production" --> QuotaCheck{"Sending Quota
Available?"} RecipientCheck -- "YES" --> QuotaCheck RecipientCheck -- "NO" --> Rejected["❌ MessageRejected Error
Send Blocked"] QuotaCheck -- "YES" --> Delivery["✅ Email Delivered
to Recipient"] QuotaCheck -- "NO" --> Throttled["⏸️ Throttled /
Daily Limit Exceeded"] style Rejected fill:#ffcccc,stroke:#cc0000 style Delivery fill:#ccffcc,stroke:#006600 style Throttled fill:#fff3cc,stroke:#cc8800
- Your Application calls the SES API (
SendEmailorSendRawEmail) with a recipient address. - SES Account Mode Check: SES first checks whether your account is in Sandbox or Production mode.
- Sandbox Path: If in Sandbox, SES checks whether the recipient address is a verified identity in your account. If it is NOT verified, the send is rejected immediately with a
MessageRejectederror. - Production Path: If in Production, SES skips the recipient verification check and proceeds directly to sending.
- Sending Quota Check: Both paths are subject to your account's sending rate and daily sending quota limits.
- Delivery: Email is handed off to the recipient's mail server.
Checking Your Current Account Status via CLI
Before submitting a production access request, confirm your current sandbox status and sending limits using the SES v2 API.
Required IAM Permission
Grant only the minimum permission needed to read account-level SES data:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SESReadQuota",
"Effect": "Allow",
"Action": "ses:GetAccount",
"Resource": "*"
}
]
}
CLI Command
aws sesv2 get-account --region us-east-1
Key fields to inspect in the response:
🔽 [Click to expand] Example get-account response (annotated)
{
"DedicatedIpAutoWarmupEnabled": false,
"EnforcementStatus": "HEALTHY",
"ProductionAccessEnabled": false, // <-- false = you are in Sandbox
"SendQuota": {
"Max24HourSend": 200.0, // Daily sending quota (Sandbox default)
"MaxSendRate": 1.0, // Emails per second
"SentLast24Hours": 3.0 // Emails sent in the last 24 hours
},
"SendingEnabled": true,
"SuppressionAttributes": {
"SuppressedReasons": [
"BOUNCE",
"COMPLAINT"
]
}
}
The critical field is ProductionAccessEnabled. When this is false, your account is in Sandbox mode. Note that exact quota values shown above are illustrative — always check the official AWS SES quotas documentation for current defaults.
How to Request Production Access (Exit the Sandbox)
Exiting the Sandbox is done through the SES console's dedicated production access request workflow. This is not a generic Service Quotas increase — it is a specific AWS review process for your SES account's sending practices.
Account Dashboard"] Console --> Form["Click: Request
Production Access"] Form --> Fill["Fill Form:
Use case, bounce handling,
opt-in process, website URL"] Fill --> Submit["Submit Request"] Submit --> Review["AWS Reviews Request
(up to 24 hours)"] Review -- "Approved" --> Production["✅ Production Access Enabled
ProductionAccessEnabled: true"] Review -- "More Info Needed" --> SupportCase["AWS Opens
Support Case"] SupportCase --> Clarify["You Provide
Clarification"] Clarify --> Review style Production fill:#ccffcc,stroke:#006600 style SupportCase fill:#fff3cc,stroke:#cc8800
- Navigate to SES Console: Open the AWS SES console in the region where your sending identity is configured.
- Find the Request: In the left navigation, go to Account dashboard. You will see a banner or section indicating your account is in the Sandbox, with a "Request production access" button.
- Complete the Request Form: Fill in the required details (see below). AWS uses this information to assess your sending legitimacy.
- AWS Review: AWS reviews your request. This is not instant — it typically takes up to 24 hours, though timing is not guaranteed.
- Outcome: You receive an email notification. If approved,
ProductionAccessEnabledbecomestrue. If more information is needed, AWS may open a support case for clarification.
What to Include in Your Production Access Request
A weak or vague request is the most common reason for delays or rejections. Be specific and complete:
| Field | What AWS Wants to Know | Strong Example |
|---|---|---|
| Mail Type | Category of email you will send | Transactional (order confirmations, password resets) |
| Website URL | Your application or company URL | https://www.yourapp.com |
| Use Case Description | Detailed explanation of your sending scenario | "We send transactional emails (order confirmations, shipping notifications) to customers who have explicitly registered on our e-commerce platform. All recipients have opted in." |
| Bounce & Complaint Handling | How you process bounces and complaints | "We have configured SNS topics for SES bounce and complaint notifications. Our application processes these events to suppress invalid addresses and unsubscribe complainants automatically." |
| Opt-in Process | How recipients consented to receive email | "Users provide their email during account registration and confirm via a double opt-in verification email." |
Pre-Flight Checklist Before Submitting
Submitting a production access request without these in place is a common mistake that leads to rejection or, worse, account suspension after approval.
- ✅ Verified sending domain with DKIM configured (not just a single email address)
- ✅ SPF and DMARC records published in your domain's DNS
- ✅ Bounce notification handling: SNS topic subscribed to SES bounce notifications, with application logic to suppress bounced addresses
- ✅ Complaint notification handling: SNS topic subscribed to SES complaint notifications, with application logic to unsubscribe complainants
- ✅ Suppression list awareness: Understand the account-level suppression list and how it interacts with your sending
- ✅ Unsubscribe mechanism: All marketing or bulk emails include a functional unsubscribe link
What Happens After Production Access is Granted
Getting out of the Sandbox is not the end of quota management — it is the beginning. Your account starts with a default production sending quota. If your application requires higher throughput, you can request a sending limit increase separately through the SES console (Account dashboard > Request increase) after you are in production mode.
Monitor your sending reputation continuously using the SES Reputation Dashboard in the console. AWS can place your account under review or pause sending if your bounce rate or complaint rate exceeds acceptable thresholds, regardless of whether you are in production mode.
Glossary
| Term | Definition |
|---|---|
| SES Sandbox | The default restricted mode for new SES accounts where emails can only be sent to verified identities. |
| Verified Identity | An email address or domain that has been confirmed as owned/controlled by you in SES, via a verification process. |
| Bounce Rate | The percentage of sent emails that could not be delivered. A high bounce rate signals poor list hygiene and can trigger account review. |
| Complaint Rate | The percentage of recipients who mark your email as spam. Monitored by AWS; high rates can result in sending suspension. |
| Sending Quota | The maximum number of emails your SES account can send per 24-hour period and per second (sending rate). Separate from Sandbox status. |
Comments
Post a Comment