25.2
Amazon SES and Pinpoint
Transactional and bulk email, campaigns and journeys, and how they differ from SNS.
14 min Reading + animations
Tip: tap or hover any dotted-underlined term to see what it means.
By the end of this lesson you will be able to
- Explain what Amazon SES is for (transactional, marketing and bulk email, sending and receiving), and send through the SES API or the SMTP interface.
- Get an account out of the SES sandbox, verify a domain, and set up SPF (custom MAIL FROM), DKIM (Easy DKIM) and DMARC so that mail lands in the inbox and forgeries do not.
- Protect sending reputation: bounce and complaint rates and the thresholds where SES reviews or pauses an account, the suppression list, shared vs dedicated IP addresses, configuration sets and event publishing.
- Receive email with receipt rules (S3, Lambda, SNS) and know where Mail Manager and Virtual Deliverability Manager fit.
- Tell SES apart from SNS precisely, and correct the notes' “SES only email, SNS only app-to-app or SMS”.
- Explain what Amazon Pinpoint did, its end of support on 30 October 2026, what continues as AWS End User Messaging, what moves to Amazon Connect, and what the exam may still expect.
- Pick SES, SNS, End User Messaging, Amazon Connect or SQS from the keywords of a scenario.
#Why: email and text messages are harder than they look
Almost every application has to talk to people: “your order is confirmed”, “here is your password reset link”, “your OTP is 482913”, “Eid sale starts tonight”. It looks simple. Install a mail server, connect to port 25, send. In practice it is one of the hardest things to run yourself:
- Mailbox providers do not trust strangers. A new server with no history, no SPF, DKIM or DMARC records and no reputation goes straight to spam, or is refused.
- Port 25 is throttled on EC2 by default, exactly because spammers love fresh cloud servers.
- One bad list poisons everything. If a marketing blast hits thousands of dead addresses, the same IP address then fails to deliver your password resets.
- Bounces, complaints and unsubscribes must be processed, or providers block you.
- SMS is a different world: per-country rules, registered sender IDs, carriers, prices per message.
AWS has managed services for each piece. This lesson covers the two that the SAA-C03 exam names, Amazon SES and Amazon Pinpoint, plus what replaced Pinpoint in 2026, and how they differ from SNS (lesson 13.4), which also sends email and SMS.
#Amazon SES
Amazon Simple Email Service (SES) is a fully managed, pay-per-use service to send and receive email at any scale, from your application, through an API or SMTP. You pay about 0.10 USD per 1,000 emails sent, with no servers, no minimum and no mail software to patch. It runs per Region: identities, quotas, the sandbox and reputation all belong to one account in one Region (Singapore ap-southeast-1 and Mumbai ap-south-1 are the usual choices from Bangladesh).
#Transactional, marketing and bulk email
SES handles both kinds of email that applications send, and AWS asks you which one is the majority when you request production access:
| Kind | What it is | Examples | Sent |
|---|---|---|---|
| Transactional | One-to-one, triggered by something the user did | Order confirmation, password reset, invoice, “your parcel has shipped”, sign-up verification | Immediately, one at a time |
| Marketing / bulk | One-to-many, promotional or informational, to a list | Weekly newsletter, Eid sale, product announcement | In batches to opted-in customers |
The distinction matters in practice: a bad marketing list can damage the reputation that your password resets depend on, so mature senders keep the two in separate configuration sets, often on separate dedicated IP pools, and sometimes in separate accounts.
#Two ways to send: the API or SMTP
- SES API (SDK or CLI):
SendEmailin API v2 (aws sesv2). Authenticated with IAM like every AWS call (lesson 2.4), so a Lambda function or EC2 instance uses its role, and the policy can limitses:SendEmailto one identity. You can send a simple message (subject, text, HTML), a raw MIME message you build yourself (custom headers, attachments), or a template with placeholders. A message can be up to 40 MB including attachments. - SMTP interface: SES offers SMTP endpoints such as
email-smtp.ap-southeast-1.amazonaws.comon ports 25, 587 or 2587 (STARTTLS) and 465 or 2465 (TLS wrapper). Use it when existing software (WordPress, an ERP, a printer, an old Java application) can only speak SMTP. It needs SMTP credentials, a user name and password derived from an IAM identity, which are not the same as an access key.
The console can also send test mail, which is how most people meet the sandbox.
#The sandbox and production access
Every new account starts in the SES sandbox, separately in each Region. In the sandbox you can use every feature, but:
- you can send only to verified addresses or domains (or to the mailbox simulator, a set of test addresses that simulate a delivery, bounce, complaint or suppression);
- at most 200 messages per 24 hours and 1 message per second.
To leave it, you request production access in the console or with aws sesv2 put-account-details --production-access-enabled: say whether the mail is mostly marketing or transactional, give the website URL, and confirm that you send only to people who asked for it and that you handle bounces and complaints. AWS gives an initial answer within about 96 hours; verifying your domain first helps. After approval the account gets a higher quota that AWS sets per account (50,000 a day is a commonly reported starting value, not a published default), which grows with good sending or on request, and you can mail any recipient. The From address must still belong to a verified identity.
#Verified identities: a domain or one address
An identity is what you are allowed to send from:
- Email address identity: SES sends a verification link to that address; click it and you can send from that one address. Good for a quick test.
- Domain identity: you prove you control the domain by publishing DNS records (with Easy DKIM, the three DKIM CNAME records do the verification). Then you can send from any address at that domain (
orders@,no-reply@,support@) and its mail can be DKIM-signed. This is what production uses.
Identities are per Region; a domain verified in Singapore must be verified again in Mumbai (the same DNS records can be reused if you bring your own DKIM key, otherwise Easy DKIM issues new tokens per Region).
#Proving the mail is really yours: SPF, DKIM and DMARC
Email was designed without any check on the From line: any server can write From: no-reply@shop.example. Three DNS-based mechanisms fix this. You met their record types in lesson 8.1 (TXT and CNAME); here is what they do for SES.
#SPF and the custom MAIL FROM domain
SPF (Sender Policy Framework) is a TXT record that lists which servers may send mail for a domain. The receiver checks it against the MAIL FROM (envelope sender, also called Return-Path) domain, not the visible From line.
By default SES uses its own MAIL FROM, a subdomain of amazonses.com, so SPF passes, but for amazonses.com, not for your domain. To make SPF pass for your domain, set up a custom MAIL FROM domain, a subdomain such as mail.shop.example, with two records:
mail.shop.example. MX 10 feedback-smtp.ap-southeast-1.amazonses.com
mail.shop.example. TXT "v=spf1 include:amazonses.com ~all"
The MX record is where bounces come back to SES; the TXT record is the SPF policy.
#DKIM and Easy DKIM
DKIM adds a digital signature to every message, made with a private key; the public key sits in DNS under <selector>._domainkey.<domain>. The receiver checks the signature, which proves the message really came from the domain owner and was not changed on the way.
With Easy DKIM, SES generates and holds the key pair. When you create a domain identity, SES gives you three CNAME records:
abc123._domainkey.shop.example. CNAME abc123.dkim.amazonses.com
def456._domainkey.shop.example. CNAME def456.dkim.amazonses.com
ghi789._domainkey.shop.example. CNAME ghi789.dkim.amazonses.com
Once SES sees them, the domain is verified and every message from it is signed. If you must control the key yourself, BYODKIM (bring your own DKIM) lets you import a private key and publish its public key as a TXT record.
#DMARC: alignment and policy
DMARC (Domain-based Message Authentication, Reporting and Conformance) is a TXT record at _dmarc.<domain>. It tells receivers two things:
- Pass rule (alignment). A message passes DMARC if SPF passes for a domain that matches the From domain, or DKIM passes with a signature from a domain that matches the From domain. One is enough.
- Policy for failures.
p=none(only report),p=quarantine(spam folder) orp=reject(refuse), plusrua=where daily aggregate reports go.
_dmarc.shop.example. TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@shop.example"
With SES, Easy DKIM on your domain is enough to pass DMARC (the signature's domain is yours). A custom MAIL FROM makes SPF align too, a second path if DKIM ever breaks. Start with p=none, read the reports for a few weeks to find every system that sends as your domain (the CRM, the helpdesk, the payroll system), then move to quarantine and reject.
Sending one email: SES signs it, the receiver checks it
A Dhaka online shop sends order confirmations from no-reply@shop.example through SES. Watch what SES adds to each message, what the customer’s mail server looks up in DNS, and what happens to a forged copy.
Scenario
SES signs the mail with the domain’s DKIM key; the receiver checks SPF, DKIM and DMARC before it trusts the From address.
Request
From
no-reply@shop.example
To
rahim@customer.example
Body
HTML + text
The app calls SendEmail with an HTML body and a plain-text fallback. It uses its IAM role, not a password: SES is just another AWS API. A legacy app could instead speak SMTP to email-smtp.ap-southeast-1.amazonaws.com with SMTP credentials.
#Reputation: bounces, complaints and the suppression list
Mailbox providers decide where your mail goes mostly from reputation: how many of your messages bounce, how many people mark them as spam, how consistently you send. SES shares IP addresses between many customers, so it protects everyone by watching each account closely.
#Bounces and complaints
- A hard bounce is a permanent failure: “550 user unknown”, the domain does not exist. Only hard bounces count towards the bounce rate. A soft bounce (mailbox full, server busy) is temporary and SES retries it for a while.
- A complaint is a recipient pressing “Report spam”. Providers that run a feedback loop send the complaint back to SES, which counts it in the complaint rate and can notify you.
SES publishes both rates for the account as the CloudWatch metrics Reputation.BounceRate and Reputation.ComplaintRate, calculated over a representative volume of your recent sending rather than one fixed day.
#When SES reviews or pauses an account
The numbers SES documents (checked for this lesson):
| Rate | Best practice | Account placed under review | Sending may be paused |
|---|---|---|---|
| Bounce rate | below 2% | 5% or more | 10% or more |
| Complaint rate | below 0.1% | 0.1% or more | 0.5% or more |
- Under review: SES emails the account owner and opens a support case. You can still send, but must fix the cause (stop the bad campaign, clean the list) before the review period ends, and reply to the case with what you changed.
- Paused: the account can no longer send in that Region, transactional mail included. You must fix the problem and ask for a review.
aws sesv2 get-accountshowsEnforcementStatus(HEALTHY,PROBATION,SHUTDOWN). - Serious abuse (phishing, spam traps, a manual investigation) can lead to a pause without a review first.
Put CloudWatch alarms on both metrics well below the review lines (for example 3% bounce and 0.05% complaint), and consider an automatic “stop the marketing configuration set” action, so a bad campaign cannot take down your password resets.
#The suppression list
The account-level suppression list stores addresses that hard-bounced or complained. When it is on (for BOUNCE, COMPLAINT or both), SES automatically adds such addresses and then refuses to send to them again without contacting the provider, so a dead address cannot hurt your bounce rate twice. You can add or remove addresses yourself (put-suppressed-destination, delete-suppressed-destination), import lists in bulk once out of the sandbox, and override the setting per configuration set. It complements, not replaces, your own handling: your application should also mark the address invalid.
#Shared, dedicated and managed IP addresses
| Shared (default) | Dedicated, standard | Dedicated, managed | |
|---|---|---|---|
| Who sends from the IPs | Many SES customers | Only your account | Only your account |
| Reputation | Managed by SES, shared | Yours alone, you must warm up each IP by sending gradually more | Yours alone; SES warms up and scales the pool per mailbox provider automatically |
| Good for | Low or irregular volume, most customers | High, steady, predictable volume; IPs that never change (a partner allowlists them) | High volume with irregular patterns |
| Cost | Included | Monthly fee per IP | Monthly fee plus a per-message charge |
Dedicated IP pools let you split traffic: one pool for transactional mail, another for marketing, chosen per configuration set. SES also supports bringing your own IP range for large senders.
#Configuration sets and event publishing
A configuration set is a named bundle of rules that you name when you send (ConfigurationSetName). It can:
- turn on open and click tracking (SES inserts a tiny image and rewrites links through its tracking domain, which you can replace with your own domain);
- choose the dedicated IP pool, override suppression settings, set a custom tracking domain and require TLS for delivery;
- publish events to event destinations.
The events are SEND, REJECT, DELIVERY, BOUNCE, COMPLAINT, DELIVERY_DELAY, RENDERING_FAILURE (a template variable was missing), OPEN, CLICK and SUBSCRIPTION. The destinations:
| Destination | What you get | Typical use |
|---|---|---|
| CloudWatch | Counts per event type, with dimensions you choose | Dashboards and alarms |
| Amazon Data Firehose | Every event record in full | S3 data lake, OpenSearch, Redshift for analysis (lesson 13.6) |
| Amazon SNS | A notification per event | Trigger code: mark addresses invalid, alert a team |
| Amazon EventBridge | An event on the default bus | Rules that route to Lambda, Step Functions, SQS (lesson 19.5) |
You can also set simpler identity-level feedback notifications (bounces, complaints, deliveries to an SNS topic, or forwarded by email) without a configuration set.
Configuration sets, events and sending reputation
The shop’s weekly newsletter goes out through a configuration set. Watch where opens, bounces and complaints go, and how a bad list drags the whole account towards a pause.
Scenario
A configuration set names where SES publishes each send, delivery, open, click, bounce and complaint.
The app names the configuration set newsletter when it sends. The set turns on open and click tracking (SES adds a tiny image and rewrites links) and lists the event destinations.
SES reputation check
Pick how much the newsletter sends per day, and what share of it hard-bounces or is marked as spam. Press Check to see the account status SES would move towards, and what to fix first.
Emails per day
Hard-bounce rate
Complaint rate
Nothing is checked yet. Choose the numbers and press Check.
#Virtual Deliverability Manager
Virtual Deliverability Manager (launched November 2022) is an opt-in SES feature, charged per email, that adds a deliverability dashboard (delivery, open, click, bounce and complaint rates by mailbox provider, sending identity and configuration set) and an advisor that finds problems such as missing DKIM or DMARC records and tells you how to fix them. A newer “global deliverability” part adds inbox placement tests and blocklist monitoring. It replaced Pinpoint's old deliverability dashboard. The exam does not ask for it by name; it is the answer in real life to “why is our mail going to spam at one provider?”.
#Receiving email
The notes' keyword “inbound email routing” is about SES as a receiver: SES can accept mail for your domain and hand it to your code. There is no mailbox and no IMAP or POP3: if people need to read mail in Outlook, that is a mail service such as Amazon WorkMail or a SaaS product, not SES.
#Receipt rules
- Verify the domain, then point its MX record at the SES receiving endpoint of a Region that supports receiving, for example
10 inbound-smtp.ap-southeast-1.amazonaws.com(Singapore and Mumbai both do; not every Region does). - Create a receipt rule set and make it active (only one is active per account and Region).
- Add receipt rules, each with recipient conditions (an address, a domain or a subdomain) and an ordered list of actions:
| Action | What it does |
|---|---|
| S3 | Writes the raw MIME message (up to 40 MB) to a bucket, optionally encrypted with KMS; can notify SNS |
| Lambda | Invokes a function, asynchronously (event) or synchronously (it can then stop further rules) |
| SNS | Publishes the whole message to a topic, but only messages up to 150 KB |
| Bounce | Returns a bounce to the sender |
| Add header | Adds a header, useful before other actions |
| Stop rule set | Ends evaluation |
| WorkMail | Hands the mail to Amazon WorkMail |
SES checks SPF, DKIM and DMARC of incoming mail and scans it for spam and viruses (on by default per rule); it only reports the verdicts, your rules or Lambda code decide what to do. IP address filters block or allow sender IP ranges during the SMTP conversation, so blocked mail is never stored or billed; receipt rules run after the message is accepted.
#Mail Manager (2024)
Mail Manager (2024) is a newer SES email gateway for organisations' inbound and outbound mail flows: ingress endpoints (open, or authenticated for trusted SMTP servers) with traffic policies (allow or deny by sender IP, TLS version, recipient), rule sets that route, archive, relay to another SMTP server (such as Microsoft 365) or write to S3, built-in archiving with search and retention for compliance, and add-ons for extra security scanning. Think of receipt rules as “mail for my application” and Mail Manager as “mail flow for my company”. It is a verified side note: the exam answer for inbound processing remains SES receiving with receipt rules.
Receiving email with SES receipt rules
Customers reply to support@shop.example. The domain’s MX record points to SES in Singapore, and an active rule set decides what happens to each message.
Scenario
A receipt rule for support@ stores the raw mail in S3, then invokes Lambda, which opens a ticket.
The customer replies. Their provider looks up the MX record of shop.example, finds inbound-smtp.ap-southeast-1.amazonaws.com, and connects to SES. Only some Regions receive email; Singapore and Mumbai do.
#SES or SNS? Correcting the notes
The notes say: “SNS is for messages or notifications (app-to-app or SMS); SES is only for email.” The second half is right, the first is incomplete. SNS also sends email, and SNS is not the only AWS service that sends SMS: AWS End User Messaging does too. The real line is between notifications to subscribers and real email or text to customers:
| Amazon SNS email | Amazon SES | |
|---|---|---|
| Purpose | Notify people who chose to get alerts | Send email from your application to anyone (customers) |
| Recipients | Subscribers who confirmed the subscription link | Any address (out of the sandbox) |
| From address | An SNS sender address | Your verified domain (orders@shop.example) |
| Format | Plain text (or JSON with email-json) | HTML, text, raw MIME, attachments, templates |
| Authentication | SNS's own | Your SPF, DKIM, DMARC |
| Rate | 10 messages per second per email subscription | Your sending quota (thousands per second possible) |
| Tracking, bounces | No opens or clicks | Opens, clicks, bounces, complaints, suppression |
| Receive replies | No | Yes, with receipt rules |
And for the rest of the notes' sentence:
- SNS does app-to-app (A2A: SQS, Lambda, Firehose, HTTP/S) and app-to-person (A2P: email, SMS, mobile push) through topics with fan-out.
- SMS from SNS is delivered by AWS End User Messaging SMS underneath (lesson 13.4). For OTPs and one-to-one transactional SMS, calling End User Messaging directly gives you sender IDs, phone pools, spend limits and delivery events.
- SES is email only, but both outbound and inbound.
SNS email, SES email and SMS side by side
Top row: an alarm tells the on-call team. Bottom row: the shop tells a customer. Both are “email”, but they are different products.
Scenario
SNS email is a notification: plain text, from an SNS address, only to confirmed subscribers.
The payment API’s error rate crosses 5% and the alarm’s action publishes to the ops-alerts topic. No code is involved.
#Amazon Pinpoint, and what happened to it
#What Pinpoint did
Amazon Pinpoint was AWS's marketing and customer engagement service. Where SES and SNS send each message you hand them, Pinpoint owned the whole campaign:
- Endpoints and segments: every customer as an endpoint (email, phone, device) with attributes (city, last purchase), and segments built from them (“customers in Dhaka who bought last Eid”).
- Campaigns (one message to a segment, once or on a schedule) and journeys (multi-step flows: wait, branch on opened or not, switch channel).
- Templates, A/B testing of message variants, quiet hours and frequency caps.
- Channels: email, SMS, mobile push, voice, in-app messages, with two-way SMS so customers could reply.
- Analytics: opens, clicks, conversions, and event streams to Kinesis or Firehose.
The notes' exam trick: “Targeted multi-channel marketing campaigns”, “user engagement”, “A/B testing for messages” → pick Pinpoint “with your eyes closed”. The slides add that Pinpoint scaled to billions of messages a day, could receive replies, and streamed events such as TEXT_SUCCESS and TEXT_DELIVERED.
#End of support: 30 October 2026
The status, checked against the Pinpoint migration guide on the day this lesson was written (1 November 2026):
- 20 May 2025: Pinpoint stopped accepting new customers.
- 30 October 2026 (two days ago as this is written): end of support. The Pinpoint console and the engagement features, endpoints, segments, campaigns, journeys, analytics and its metrics APIs, in-app messaging and recommenders, are no longer available.
- What continues: the message-delivery APIs, renamed AWS End User Messaging in Q3 2024: SMS, MMS, voice, mobile push, WhatsApp, the OTP APIs (
SendOTPMessage,VerifyOTPMessage) and phone number validation. Push, OTP and phone validation work for all accounts; SMS, voice and email sending through the Pinpoint API keep working only for customers who signed up before 20 May 2025, and AWS points them to End User Messaging and SES; event and metric delivery to Kinesis, Firehose and CloudWatch continues for direct sends. - Where engagement went: AWS recommends Amazon Connect (outbound campaigns, which now also run journeys, and Customer Profiles) for segments, campaigns and journeys; Amazon SES for email (and SES Virtual Deliverability Manager for the deliverability dashboard); Kinesis for event collection.
So in 2026 a new project that wants “Pinpoint” builds it from three services:
| Pinpoint feature | Today |
|---|---|
| Segments, campaigns, journeys, A/B testing, customer profiles | Amazon Connect outbound campaigns + Customer Profiles |
| Email channel | Amazon SES |
| SMS, MMS, voice, push, WhatsApp, OTP, phone validation | AWS End User Messaging |
| Event collection and mobile analytics | Amazon Kinesis (or your own analytics) |
Amazon Connect is AWS's cloud contact centre (lesson 18.1): phone numbers, queues and agents. Its outbound campaigns can run journeys across voice, SMS, email and WhatsApp with or without agents. That is why the engagement half of Pinpoint moved there.
A Pinpoint journey, and what replaces it in 2026
The shop’s “abandoned cart” journey ran on Amazon Pinpoint. Pinpoint reached end of support on 30 October 2026. Watch the old flow, the cut-off, and how the same job is built today.
Scenario
One service held the audience, the journey logic, the channels and the analytics.
The app reports an event: a customer added a phone to the cart and left. Pinpoint keeps every customer as an endpoint with attributes (city, last purchase) for segments.
#Choosing a messaging service
The comparison the exam keeps asking for, with SQS for contrast (it sends to programs, not people; lesson 13.1):
| SES | SNS | End User Messaging | Amazon Connect | SQS | |
|---|---|---|---|---|---|
| Talks to | People, by email | Programs and people (fan-out) | People, by SMS, voice, push, WhatsApp | People, through campaigns and agents | Programs |
| Channels | Email out and in | SQS, Lambda, Firehose, HTTP/S, email, SMS, push | SMS, MMS, voice, push, WhatsApp, OTP | Voice, chat, SMS, email, WhatsApp, tasks | Queue messages |
| Typical use | Order confirmation, password reset, newsletter, receive replies | Alerts to ops, fan-out of events, push to a topic | OTP SMS, delivery SMS, push to one device | Marketing journeys, segments, contact centre | Decoupling, buffering, work queues |
| Exam keywords | HTML email, transactional, marketing, bulk email, inbound email | Pub/sub, fan-out, notify subscribers, mobile push | SMS sender ID, OTP, two-way SMS | Contact centre, outbound campaigns, (formerly Pinpoint: targeted campaigns, A/B testing) | Decouple, buffer, retry later |
Which messaging service?
Each card is one message to send or receive. Pick the service that fits best, then read why the others lose.
1.A Daraz-style shop sends a password reset email with its own logo and a link, from no-reply@shop.example, within seconds of the request.
2.A weekly HTML newsletter to 80,000 customers who opted in, with an unsubscribe link and open and click tracking.
3.A bank sends a 6-digit login OTP by SMS to customers in Bangladesh (+880), with an alphanumeric sender ID.
4.A CloudWatch alarm must email the five on-call engineers when the payment API error rate crosses 5%.
5.The order service must hand each new order to the invoice service, which sometimes goes down for an hour; no order may be lost.
6.Customers reply to support@shop.example; every reply must be stored and turned into a ticket automatically.
7.Marketing wants a multi-step Eid journey: a segment of customers who bought last Eid gets an email, then an SMS two days later if they did not open it, with an A/B test.
8.A ride-sharing app sends a push notification to every phone subscribed to the “rain-surge” topic in one publish call.
9.An insurance company wants agents to call customers back from a queue, with predictive dialling and the customer history on screen.
Right first time: 0 / 0 (9)
#What goes wrong
| Symptom | Likely cause | Fix |
|---|---|---|
MessageRejected: Email address is not verified for real customers | Account still in the SES sandbox in this Region | Request production access; until then use verified addresses or the mailbox simulator |
Throttling: Maximum sending rate exceeded | Above the per-second quota | Send at a controlled rate (a queue in front), request a higher quota |
| Mail goes to spam at one provider | DKIM or DMARC missing or failing, no custom MAIL FROM, sudden volume jump on a dedicated IP | Publish Easy DKIM CNAMEs, DMARC, custom MAIL FROM; warm up dedicated IPs; check Virtual Deliverability Manager |
| DMARC reports show failures for your domain from servers you know | Another system (CRM, helpdesk) sends as your domain without DKIM | Move it to SES or give it its own DKIM; then tighten the policy |
| Account under review, then sending paused | Bounce rate 5%+ / 10%+ or complaint rate 0.1%+ / 0.5%+ | Stop the campaign, clean the list, suppression list on, double opt-in, unsubscribe link; answer the case |
| Password resets stopped during a marketing incident | Marketing and transactional mail share one account and reputation | Separate configuration sets and IP pools, or separate accounts |
| A send to a known address silently does nothing | Address is on the suppression list (it bounced or complained) | Check get-suppressed-destination; remove only if you are sure it is valid again |
| EC2-hosted mail server cannot send | Port 25 is throttled on EC2 | Use SES (API or SMTP on 587), or request removal of the throttle |
| Incoming mail never reaches the Lambda function | MX not pointing to SES, rule set not active, Region without receiving, bucket policy missing, message over 150 KB on the SNS action | Fix MX, activate the rule set, allow SES in the bucket policy, use the S3 action |
| SMS to Bangladesh not delivered | Still in the SMS sandbox or monthly spend limit reached; unsupported origination identity | Request production access and a higher spend limit; use a sender ID |
| Old Pinpoint journey stopped on 30 October 2026 | End of support for engagement features | Rebuild in Amazon Connect outbound campaigns; email through SES; SMS and push through End User Messaging |
#Messaging in system design
- Never send email inside the user's request. Write the order, publish an event (DynamoDB Streams, SNS, EventBridge or SQS), and let a worker call SES. Sign-up and checkout stay fast and do not fail when email has a bad minute (lessons 15.5 and 15.8).
- Put a queue in front of SES for bursts. A flash sale can produce more emails than the per-second quota; an SQS queue with a Lambda consumer at controlled concurrency sends at a steady rate and retries throttles.
- Separate reputations. Transactional and marketing mail in different configuration sets, IP pools or accounts; a marketing mistake must not stop password resets.
- Close the feedback loop. Bounce and complaint events → SNS or EventBridge → a function that marks addresses invalid; alarms on the reputation metrics.
- Authenticate the domain once, for every sender. Every system that sends as your domain needs DKIM (and ideally SPF alignment); then DMARC can move to
reject. - Multi-Region: identities, quotas and sandbox status are per Region. For DR, verify the domain and get production access in a second Region before you need it.
- Do not confuse channels with campaigns. SES and End User Messaging deliver messages; segments, journeys and agents belong in Amazon Connect (or a marketing platform).
- Cost: SES is roughly 0.10 USD per 1,000 emails; SMS is priced per message per country and is far more expensive per message, which is one reason OTPs are often sent by email or push where acceptable.
#Try it yourself
These commands use ap-southeast-1 (Singapore), the domain shop.example and account 111122223333. Use your own domain, and remember that sandbox accounts can only send to verified addresses.
# 1. Verify a domain identity; Easy DKIM returns three tokens to publish as CNAME records
aws sesv2 create-email-identity --email-identity shop.example
# {
# "IdentityType": "DOMAIN",
# "VerifiedForSendingStatus": false,
# "DkimAttributes": {
# "SigningEnabled": true,
# "Status": "PENDING",
# "Tokens": ["abc123exampletoken", "def456exampletoken", "ghi789exampletoken"],
# "SigningAttributesOrigin": "AWS_SES"
# }
# }
# Publish: abc123exampletoken._domainkey.shop.example CNAME abc123exampletoken.dkim.amazonses.com (and the other two)
# 2. A custom MAIL FROM domain (then publish its MX and SPF TXT records)
aws sesv2 put-email-identity-mail-from-attributes --email-identity shop.example \
--mail-from-domain mail.shop.example --behavior-on-mx-failure USE_DEFAULT_VALUE
# 3. Is the account still in the sandbox? What are the quotas and the enforcement status?
aws sesv2 get-account
# {
# "SendQuota": { "Max24HourSend": 200.0, "MaxSendRate": 1.0, "SentLast24Hours": 3.0 },
# "SendingEnabled": true,
# "ProductionAccessEnabled": false,
# "EnforcementStatus": "HEALTHY"
# }
# 4. Request production access
aws sesv2 put-account-details --production-access-enabled --mail-type TRANSACTIONAL \
--website-url https://shop.example --contact-language EN \
--additional-contact-email-addresses ops@shop.example
# 5. A configuration set that sends bounces and complaints to an SNS topic
aws sesv2 create-configuration-set --configuration-set-name transactional
aws sesv2 create-configuration-set-event-destination --configuration-set-name transactional \
--event-destination-name feedback-to-sns \
--event-destination '{"Enabled":true,"MatchingEventTypes":["BOUNCE","COMPLAINT"],
"SnsDestination":{"TopicArn":"arn:aws:sns:ap-southeast-1:111122223333:ses-feedback"}}'
# 6. Send a simple HTML + text email through the configuration set
aws sesv2 send-email --from-email-address orders@shop.example \
--destination ToAddresses=success@simulator.amazonses.com \
--configuration-set-name transactional \
--content '{"Simple":{"Subject":{"Data":"Order #10234 confirmed"},
"Body":{"Text":{"Data":"Thank you for your order."},
"Html":{"Data":"<h1>Thank you!</h1><p>Order <b>#10234</b> is confirmed.</p>"}}}}'
# { "MessageId": "010e019a1b2c3d4e-5f6a7b8c-0000-0000-0000-000000000000-000000" }
# 7. Test a bounce safely with the mailbox simulator, then look at the suppression list
aws sesv2 send-email --from-email-address orders@shop.example \
--destination ToAddresses=bounce@simulator.amazonses.com \
--content '{"Simple":{"Subject":{"Data":"test"},"Body":{"Text":{"Data":"test"}}}}'
aws sesv2 put-account-suppression-attributes --suppressed-reasons BOUNCE COMPLAINT
aws sesv2 put-suppressed-destination --email-address old.customer@customer.example --reason BOUNCE
aws sesv2 list-suppressed-destinations --reasons BOUNCE --query 'SuppressedDestinationSummaries[].EmailAddress'
# [ "old.customer@customer.example" ]
# 8. Receive mail: a rule set that stores support@ mail in S3 and invokes a function
aws ses create-receipt-rule-set --rule-set-name inbound
aws ses create-receipt-rule --rule-set-name inbound --rule '{
"Name": "support", "Enabled": true, "ScanEnabled": true, "TlsPolicy": "Require",
"Recipients": ["support@shop.example"],
"Actions": [
{"S3Action": {"BucketName": "shop-inbound-mail-example", "ObjectKeyPrefix": "support/"}},
{"LambdaAction": {"FunctionArn": "arn:aws:lambda:ap-southeast-1:111122223333:function:open-ticket",
"InvocationType": "Event"}}]}'
aws ses set-active-receipt-rule-set --rule-set-name inbound
# Then: shop.example MX 10 inbound-smtp.ap-southeast-1.amazonaws.com
# 9. SNS email for comparison: the subscriber must confirm before anything arrives
aws sns subscribe --topic-arn arn:aws:sns:ap-southeast-1:111122223333:ops-alerts \
--protocol email --notification-endpoint oncall@shop.example
# { "SubscriptionArn": "pending confirmation" }
# 10. An SMS through AWS End User Messaging (the former Pinpoint SMS API)
aws pinpoint-sms-voice-v2 describe-account-attributes
# { "AccountAttributes": [ { "Name": "ACCOUNT_TIER", "Value": "SANDBOXED" } ] }
aws pinpoint-sms-voice-v2 send-text-message --destination-phone-number +8801XXXXXXXXX \
--origination-identity SHOPBD --message-type TRANSACTIONAL \
--message-body "Your order #10234 has shipped."
# { "MessageId": "a1b2c3d4-1111-2222-3333-444455556666" }
# (+8801XXXXXXXXX stands for your own verified test number while the account is sandboxed)
# 11. Clean up
aws ses set-active-receipt-rule-set
aws ses delete-receipt-rule-set --rule-set-name inbound
aws sesv2 delete-configuration-set --configuration-set-name transactional
aws sesv2 delete-email-identity --email-identity shop.example
Also try in the console: open SES, Get set up, and look at the sandbox banner and the production access form; open an identity's Authentication tab to see the DKIM records and their status; open Reputation metrics to see the two rates and their thresholds.
#Summary
Key takeaways
- SES sends and receives email: transactional (order confirmation, password reset) and marketing or bulk; through the API (IAM) or the SMTP interface (SMTP credentials); about 0.10 USD per 1,000 emails; everything is per Region.
- Sandbox (per Region): only verified recipients or the mailbox simulator, 200 per 24 hours, 1 per second; leave it by requesting production access (answer within about 96 hours). The From identity must always be verified.
- Authentication: SPF (custom MAIL FROM subdomain: MX to feedback-smtp, TXT
include:amazonses.com), DKIM (Easy DKIM: three CNAMEs, SES signs every message), DMARC (passes if SPF or DKIM aligns with the From domain;p=none,quarantine,reject). - Reputation: bounce rate best under 2%, review at 5%, pause at 10%; complaint rate best under 0.1%, review at 0.1%, pause at 0.5%. Use the suppression list, alarms on
Reputation.*metrics, and separate transactional from marketing. - Configuration sets: open and click tracking, IP pools, event publishing to CloudWatch, Data Firehose, SNS, EventBridge. Shared IPs by default; dedicated standard (you warm up) or managed (SES warms up and scales).
- Receiving: MX to SES, active receipt rule set, actions S3 (40 MB), Lambda, SNS (150 KB), bounce, stop; IP filters block before acceptance. Mail Manager (2024) is the company-wide email gateway; Virtual Deliverability Manager is the deliverability dashboard and advisor.
- SNS vs SES: SNS email is plain-text notification to confirmed subscribers; SES is real email from your domain to anyone. SNS also does SMS and push (SMS through End User Messaging).
- Pinpoint: segments, campaigns, journeys, A/B tests, multi-channel; no new customers since 20 May 2025, end of support 30 October 2026. Channels continue as AWS End User Messaging (SMS, voice, push, OTP, phone validation); engagement moves to Amazon Connect outbound campaigns and Customer Profiles; email to SES. On the exam, “targeted multi-channel campaigns / A/B testing” → Pinpoint if offered.
Answer on your own first, then read the explanation, even when you got it right.
Self-checkQuestion
Which kinds of email is Amazon SES designed to send?
Self-checkQuestion
A new account tries to send its first order confirmation to a customer from SES in ap-southeast-1 and gets MessageRejected: Email address is not verified. The sender domain is verified. What is the cause?
Self-checkQuestion
What are the SES sandbox sending limits?
Self-checkQuestion
Which statement about SES production access is correct?
Self-checkQuestion
A legacy ERP system can send email only through SMTP. How can it use SES?
Self-checkQuestion
What does Easy DKIM do?
Self-checkQuestion
An email from SES shows SPF pass for a subdomain of amazonses.com and DKIM pass for shop.example. The From address is no-reply@shop.example. What is the DMARC result?
Self-checkQuestion
Why would a company set up a custom MAIL FROM domain such as mail.shop.example?
Self-checkQuestion
Attackers send emails with From: alerts@bank.example from their own servers. The bank sends real mail through SES with Easy DKIM. What stops receivers from delivering the forgeries?
Self-checkQuestion
According to SES, at which complaint rate is an account placed under review, and at which may sending be paused?
Self-checkQuestion
Which bounces count towards the SES bounce rate?
Self-checkQuestion
A newsletter account reaches a 6% bounce rate after a campaign to an old list. What happens and what should the team do?
Self-checkQuestion
An SES account that sends both password resets and an aggressive marketing newsletter has its sending paused because of complaints. Which design would have protected the password resets best?
Self-checkQuestion
What does the SES account-level suppression list do?
Self-checkQuestion
A marketing team wants every open and click of its newsletter stored in S3 for analysis in Athena. What should be configured?
Self-checkQuestion
Which are the event destinations of an SES configuration set?
Self-checkQuestion
A company sends 3 million marketing emails a month in large, irregular bursts and wants its own reputation, isolated from other SES customers, without warming up IP addresses by hand. What fits?
Self-checkQuestion
Customers' replies to support@shop.example must be stored durably, with attachments up to 20 MB, and turned into tickets. Which design is correct?
Self-checkQuestion
A spam source floods the company's SES inbound address. The company wants to block it as cheaply as possible, before any processing. What should it use?
Self-checkQuestion
The notes say “SNS is for app-to-app or SMS, and SES is only for email”. Which correction is most accurate?
Self-checkQuestion
An operations team must receive an email whenever a CloudWatch alarm fires. Which is simplest?
Self-checkQuestion
What was Amazon Pinpoint mainly used for?
Self-checkQuestion
It is November 2026. A team asks you to set up Amazon Pinpoint journeys for a new account. What is the accurate answer?
Self-checkQuestion
Which Pinpoint capabilities continue after 30 October 2026 under the AWS End User Messaging name?
Self-checkQuestion
An exam question asks for a service to run targeted multi-channel marketing campaigns with A/B testing of messages. The options are Amazon SNS, Amazon SES, Amazon Pinpoint and Amazon SQS. Which should you choose?
Self-checkQuestion
A bank in Dhaka needs to send login OTPs by SMS to customers in Bangladesh using an alphanumeric sender ID. Which statements are correct? (Choose two.)
Choose 2
Self-checkQuestion
Which two statements about SNS email compared with SES are correct? (Choose two.)
Choose 2
Self-checkQuestion
Which two DNS records belong to a correct SES custom MAIL FROM setup for mail.shop.example in Singapore? (Choose two.)
Choose 2
Self-checkQuestion
Which two are valid SES receipt rule actions? (Choose two.)
Choose 2
Self-checkQuestion
A shop moves its DNS to a new provider. A week later, order emails land in spam at several providers and DMARC reports show DKIM failing. Which two actions fix it most directly? (Choose two.)
Choose 2