Simulating SES Bounce, Complaint, and Reject Events
Triggering SES bounce, complaint, and reject notifications with simulator addresses, without sending real mail to any recipient.
SES provides simulator addresses for testing how an application handles bounce, complaint, and reject notifications without sending real mail to affected recipients. Details are available in the official documentation.
Prerequisites
Before starting, complete the following:
- Register an email address in your AWS SES.
- Enable Email Feedback Forwarding for the registered email address.

Simulating Bounce
A bounce can be simulated with:
aws ses send-email \ --from <YOUR_EMAIL> \ --subject test \ --text testYou will receive an email at the address specified by the --from option, indicating a bounce occurred.

Simulating Complaint
A complaint follows the same pattern, targeting a different simulator address:
aws ses send-email \ --from <YOUR_EMAIL> \ --subject test \ --text testAn email indicating a complaint will be sent to the --from address.

Simulating Reject
A reject requires sending an email with an EICAR test file attachment, which SES’s virus scanning flags:
FROM=<YOUR_EMAIL>MESSAGE='{"Data": "From: $FROM\nTo: $FROM\nSubject: test\nMIME-Version: 1.0\nContent-type: Multipart/Mixed; boundary=\"NextPart\"\n\n--NextPart\nContent-Type: text/plain\n\ntest\n\n--NextPart\nContent-Type: text/plain;\nContent-Disposition: attachment; filename=\"sample.txt\"\n\nX5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*\n\n--NextPart--"}'MESSAGE=$(echo $MESSAGE | sed "s/\$FROM/$FROM/g")aws ses send-raw-email \ --cli-binary-format raw-in-base64-out \ --raw-message "$MESSAGE"You will receive a rejection notification email at the FROM address.

Conclusion
These three simulator addresses made it possible to trigger bounce, complaint, and reject notifications from SES without sending real mail to any actual recipient. [email protected] and [email protected] cover the two most common notification paths with nothing more than a plain send-email call, which makes it easy to exercise that handling logic long before any real recipient is involved. The reject case takes more effort — it needs send-raw-email with a MIME payload carrying an EICAR-flagged attachment rather than a simple text body — but that extra setup is exactly why it’s worth testing explicitly instead of assuming the same code path that handles bounces will handle a virus-scan rejection correctly.
Related posts
Sign in with Slack Using Cognito User Pools and OIDC
Federating Cognito user pools with Slack over OIDC and wiring "Sign in with Slack" into a Next.js app with Amplify.
Deploying FastAPI on AWS Lambda with Lambda Web Adapter
This example guides you through the process of developing API backends with FastAPI using Lambda Web Adapter.
API Gateway WebSocket: Implementing a Mock Integration
Building an API Gateway WebSocket API entirely with mock integrations, returning canned responses with no backend Lambda involved.
Uploading to S3 Through CloudFront Pre-Signed URLs
CloudFront signed URLs let you upload to S3 through a custom domain—useful when direct S3 pre-signed URLs are not an option.
AWS EventBridge Scheduler: Starting and Stopping EC2 on a Schedule
Starting and stopping EC2 instances on a cron schedule with EventBridge Scheduler calling the EC2 API directly, no Lambda involved.
