DMARC, SPF and DKIM for Amazon SES
Updated 2026-11-07
Amazon SES (Amazon Simple Email Service) is a sending service: your application hands it messages, and SES delivers them. You verify your domain as an identity in the SES console and publish the DNS records yourself, unless Route 53 hosts your zone and SES publishes them for you. This guide follows the SES Developer Guide. For the background on each standard, see SPF explained, DKIM explained and DMARC explained.
What Amazon SES sends from
Every message has a visible From address and a MAIL FROM address, also called the envelope sender or Return-Path. The From address is your own domain, for example [email protected]. The MAIL FROM domain is not, unless you change it: "Messages that you send through Amazon SES automatically use a subdomain of amazonses.com as the default MAIL FROM domain." The exact subdomain is not printed; the docs only say it "varies based on the AWS Region that you use Amazon SES in."
SPF passes for that subdomain, so SES says "SPF is implicitly set up for you". But the domain belongs to Amazon, so SPF does not align with example.com. Aligned SPF needs a custom MAIL FROM domain, a subdomain of your own domain. This guide uses bounce.example.com; the name is your choice.
SES sets rules for it. It "has to be a subdomain of the parent domain of a verified identity", it "shouldn't be a subdomain that you also use to send email from", and it "shouldn't be a subdomain that you use to receive email."
SPF
With a custom MAIL FROM domain, you publish two records on the subdomain. As of November 2026 the console shows them in this format, with region replaced by your AWS Region (the docs give us-west-2, us-east-1 and eu-west-1 as examples):
bounce.example.com MX 10 feedback-smtp.eu-west-1.amazonses.com.
bounce.example.com TXT "v=spf1 include:amazonses.com ~all"
The MX record receives "the bounce and complaint notifications that email providers send you." SES is strict: "you must publish exactly one MX record to the DNS server of your MAIL FROM domain. If the MAIL FROM domain has multiple MX records, the custom MAIL FROM setup with Amazon SES will fail."
The TXT record goes on bounce.example.com, because receivers check SPF against the MAIL FROM domain. The SES docs do not ask you to add include:amazonses.com to the record on example.com, which still covers your other senders.
The record uses 1 DNS lookup itself. Amazon does not document a number for include:amazonses.com. When we counted it with real DNS on 7 November 2026, its record held only IP ranges, so it cost 1 lookup in total (the include itself) and nothing further. Amazon can change it, so check your tree with the SPF lookup counter. RFC 7208 sets the limit at 10 lookups. Above that, receivers return a permanent error and SPF fails (see too many SPF lookups).
The documented record ends in ~all (softfail). That is fine with DMARC: DMARC decides what happens to failing mail, not the all term.
DKIM
SES offers Easy DKIM, BYODKIM (your own key pair) and manual signing. This guide covers Easy DKIM, the console default: "the SES default setting which uses Easy DKIM with a 2048 bit signing length". With Easy DKIM, "SES generates a public-private key pair and automatically adds a DKIM signature to every message that you send from that identity".
You publish three CNAME records that SES generates. The docs describe the value as "the DKIM token followed by a hosted zone domain (for example, token.dkim.us-west-2.amazonses.com)", and the hosted zone "varies by AWS Region and identity." The records look like this, with token1 to token3 standing for the generated tokens:
token1._domainkey.example.com CNAME token1.dkim.us-west-2.amazonses.com.
token2._domainkey.example.com CNAME token2.dkim.us-west-2.amazonses.com.
token3._domainkey.example.com CNAME token3.dkim.us-west-2.amazonses.com.
Steps, based on the docs:
- In the SES console, under Configuration, choose Identities and open the domain.
- On the Authentication tab, check that Easy DKIM is enabled. Keep the key length at
RSA_2048_BITunless your DNS host only supportsRSA_1024_BIT. - Expand Publish DNS records and copy the three CNAME records.
- Add them at your DNS host, or let SES publish them if Route 53 hosts the zone.
- Wait. "It can take up to 72 hours for changes to DNS settings to propagate." When SES finds all three, DKIM shows as Successful.
The docs do not print a sample DKIM-Signature header. The keys sit under _domainkey.example.com, so, by how DKIM works, the signature carries d=example.com.
Easy DKIM is set up per Region: "If you use more than one AWS Region to send email, you have to complete the DKIM setup process in each of those Regions".
DMARC alignment
DMARC passes when SPF or DKIM passes and the authenticated domain aligns with the From domain.
- SPF alignment compares the MAIL FROM (
Return-Path) domain with theFromdomain. With the defaultamazonses.comsubdomain, it cannot align. SES notes that SPF alignment is rarely possible "when sending mail through third-party bulk email providers because the Return-Path (MAIL FROM) is used for bounces and complaints that the provider (SES) tracks using an address they own." Withbounce.example.comas custom MAIL FROM domain, it aligns withexample.comunder relaxed alignment. SES says that "In order to achieve SPF alignment with SES, the domain's DMARC policy must not specify a strict SPF policy (aspf=s)." - DKIM alignment compares the
d=domain with theFromdomain. Easy DKIM signs with keys underexample.com, so a valid signature aligns. If yourFromaddress uses a subdomain such asnews.example.comwhile DKIM signs asexample.com, keep relaxed alignment (noadkim=s), as SES advises: "ensure that your DMARC policy is set to relaxed alignment".
Relaxed alignment is the default when your record has no aspf or adkim tag. Without a custom MAIL FROM domain, DMARC rests on DKIM alone. SPF adds a second path. SES warns that forwarding changes the envelope in a way that "invalidates SPF authentication", while DKIM "works even when a message has been forwarded between mail servers (as long as the message content has not been modified)." Set up both.
Step by step to p=reject
- Verify the domain with Easy DKIM. Create the domain identity in SES and publish the three DKIM CNAMEs from the console. Wait until DKIM shows as Successful.
- Set up a custom MAIL FROM domain. Choose an unused subdomain such as
bounce.example.com. As of November 2026, publish one MX record tofeedback-smtp.<region>.amazonses.comand the TXT recordv=spf1 include:amazonses.com ~allon it. Wait until SES emails you that the setup succeeded; detecting the MX record can take up to 72 hours. - Start DMARC at p=none with reports. Publish a TXT record at
_dmarc.example.comwithv=DMARC1; p=none; rua=mailto:[email protected]. This policy does not protect the domain yet; it only turns on aggregate reports. - Read the reports and fix other senders. For two to four weeks, look at which servers send as your domain. Give every legitimate service SPF and, where it offers it, DKIM for your domain, so that its mail aligns too.
- Move to quarantine. Change the policy to
p=quarantineonce reports show only aligned mail from your own services. Failing mail is now usually placed in spam, so a sender you missed is still recoverable. - Reject. Change the policy to
p=rejectwhen the reports stay clean. Receivers then refuse mail that fails DMARC.
The record for step 3:
_dmarc.example.com TXT "v=DMARC1; p=none; rua=mailto:[email protected]"
The final record:
_dmarc.example.com TXT "v=DMARC1; p=reject; rua=mailto:[email protected]"
The SES docs recommend the same order: start with "a simple monitoring-mode record" at p=none, then p=quarantine, and "Implementing a reject policy is usually the final step." Their example record uses p=quarantine; we read it as a syntax example, not a starting point.
Common mistakes
- No custom MAIL FROM domain. SPF passes but never aligns, so DMARC depends on DKIM alone.
- The SPF record on the wrong name.
include:amazonses.combelongs on the MAIL FROM subdomain. - More than one MX record on the MAIL FROM subdomain. SES requires exactly one, or the setup fails.
- A silent fallback. With "Use default MAIL FROM domain" as "Behavior on MX failure", SES goes back to the
amazonses.comsubdomain when the MX record is missing, and SPF stops aligning. The other option, "Reject message", returns aMailFromDomainNotVerifiederror instead. Pick on purpose. - Strict SPF alignment. With
aspf=sin your DMARC record, SPF frombounce.example.comno longer aligns withexample.com. - DKIM in only one Region. If you send from several AWS Regions, each needs DKIM set up, or some mail goes out unsigned (DKIM not found).
- The domain typed twice, or an extra underscore. Some DNS hosts append the domain. SES also warns: "Do not add any additional underscores (_) at the beginning of the CNAME record names."
- Two SPF records on one name. Receivers return a permanent error (multiple SPF records).
- No rua address. Without
ruayou get no reports and cannot see other senders (DMARC without rua). - Relying on a test flag. Some receivers support a test flag:
t=yin RFC 9989 (DMARCbis), which obsoletes RFC 7489, orpctin RFC 7489. Neither is a safety net. RFC 7489 says unknown tags must be ignored, so a receiver that implements only RFC 7489 can treatp=reject; t=yas a full reject, and receivers that follow RFC 9989 no longer usepct. Move fromp=nonetop=quarantinetop=rejectand let the reports decide each step.
How to check it
Run the email security check on example.com and the SPF lookup counter on bounce.example.com. SES generates its DKIM selectors per identity, so the DKIM selector finder, which tries common names, will most likely report no common selectors. That does not mean DKIM is missing. Read the s= tag in the DKIM-Signature header of a message sent through SES instead. Build or check your policy with the DMARC record generator. The Return-Path header of the same message shows whether SES used your MAIL FROM domain.
Sources
- Using a custom MAIL FROM domain, Amazon SES Developer Guide, fetched 2026-11-07.
- Authenticating Email with SPF in Amazon SES, Amazon SES Developer Guide, fetched 2026-11-07.
- Authenticating Email with DKIM in Amazon SES, Amazon SES Developer Guide, fetched 2026-11-07.
- Easy DKIM in Amazon SES, Amazon SES Developer Guide, fetched 2026-11-07.
- Creating and verifying identities in Amazon SES, Amazon SES Developer Guide, fetched 2026-11-07.
- Complying with DMARC authentication protocol in Amazon SES, Amazon SES Developer Guide, fetched 2026-11-07.
- RFC 9989: Domain-Based Message Authentication, Reporting, and Conformance (DMARC), RFC Editor, fetched 2026-11-06.
- RFC 7489: Domain-based Message Authentication, Reporting, and Conformance (DMARC), RFC Editor, fetched 2026-11-06.
Frequently asked questions
Does SPF align with DMARC on Amazon SES by default?
No. By default SES uses a subdomain of amazonses.com as the MAIL FROM domain. SPF passes for that domain, but it is not your domain, so it does not align with your From address. For aligned SPF you set up a custom MAIL FROM domain, such as bounce.example.com, with its own MX and SPF records.
What SPF record does Amazon SES document?
As of November 2026 the console shows v=spf1 include:amazonses.com ~all as a TXT record on your custom MAIL FROM subdomain, not on the domain itself. The same subdomain also needs one MX record that points at feedback-smtp.<region>.amazonses.com.
Which DKIM selectors does Easy DKIM use?
SES generates them for you. The console shows three CNAME records whose names end in ._domainkey.example.com and whose values point at a hosted zone under amazonses.com, for example token.dkim.us-west-2.amazonses.com. The tokens differ per identity and Region, so copy them from the console.
Is DKIM alone enough for DMARC with Amazon SES?
It is enough for a DMARC pass, because DMARC needs only one aligned method. Easy DKIM signs for your domain, so it aligns. A custom MAIL FROM domain adds aligned SPF as a second path, which SES describes as the way to use SPF, DKIM or both for DMARC.