Amazon SES: aligning SPF and DKIM for DMARC
By Thomas · virtual CISO · September 04, 2026
Amazon SES (Simple Email Service) holds a particular place among sending platforms: billed per message, driven by API or SMTP, it serves transactional application email as readily as high-volume campaigns. That flexibility comes with an authentication cost: unlike an office suite where DKIM is a two-click affair, SES leaves the sender to wire alignment up by hand — and the default configuration, once the domain identity is verified, is not enough to make DMARC pass.
The most common misunderstanding sits at that verification step. Adding a domain to SES and "verifying" it only proves that the console controls the DNS zone; it aligns neither SPF nor DKIM. Until more is done, the envelope of outgoing messages leaves under a subdomain of amazonses.com, and no signature carries the domain shown in the From header. A recipient enforcing a p=reject policy then rejects this otherwise legitimate traffic.
This guide covers the three building blocks that make SES DMARC-compatible: Easy DKIM and its three CNAMEs, the custom MAIL FROM domain that reaches for SPF alignment, and the BYODKIM alternative for organisations that refuse any delegation. Then the most frequent configuration mistakes, and the final proof — reading the RUA reports.
Easy DKIM: three CNAMEs, an aligned signature
The recommended option is Easy DKIM. When enabled on a domain identity, SES generates a key pair and publishes the public key on its side; the sender, in turn, places three CNAME records in the domain zone — here example.com:
xxxx1._domainkey.example.com. CNAME xxxx1.dkim.amazonses.com.
xxxx2._domainkey.example.com. CNAME xxxx2.dkim.amazonses.com.
xxxx3._domainkey.example.com. CNAME xxxx3.dkim.amazonses.com.
The three prefixes (opaque tokens specific to the identity) map to three DKIM selectors. The logic is one of delegation: the key is not copied into the domain zone, it lives at Amazon, and the CNAME bridges the two. When a receiving server checks a signature d=example.com; s=xxxx1, DNS resolution follows the CNAME and fetches the key from SES, transparently. Three selectors are provisioned from the outset so keys can rotate without any manual change to the zone — cryptographic hygiene handed to whoever industrialises it.
The point that matters for DMARC: the signature produced carries d=example.com, the organisational domain itself, not an Amazon domain. DKIM alignment is therefore secured, even in strict mode. On this mechanism alone DMARC already passes — provided the three CNAMEs have propagated and the key shows as active in the console.
Domain identity, subdomains, and leaving the sandbox
Before authentication even enters the picture, SES imposes two structural choices that bear on DMARC. The first is the scope of the verified identity: SES distinguishes a domain identity from an address identity. Verifying a single address (contact@example.com) permits sending from that one mailbox but does not enable Easy DKIM at the domain scale — the aligned signature does not follow. For any serious use, it is the domain identity that must be verified: it covers every address on the domain and, above all, it carries the DKIM configuration. A subdomain dedicated to transactional sending (mailer.example.com) can moreover form a distinct identity, with its own keys — a useful segmentation when an application flow needs to stay isolated from human mail.
The second choice concerns the sandbox. Every new SES account starts in sandbox mode: sending is possible only to addresses that are themselves verified, and volume is capped. This constraint has nothing to do with authentication, but it often muddies diagnosis: a test that "does not go out" is sometimes a sandbox matter, not a DKIM error. Leaving the sandbox is requested from AWS and gates sending to arbitrary recipients — a step to clear before any large-scale DMARC verification campaign.
On cryptography, finally, Easy DKIM provisions RSA 2048-bit keys by default, robust and accepted everywhere. SES rotates them transparently thanks to the three selectors, so there is no reason to keep an old key around. The 1024-bit length, still tolerated by some legacy tools, should be avoided for any new configuration: several mail operators now treat it as weak.
One last mechanism deserves attention for monitoring: configuration sets. They attach an event stream to sends — deliveries, complaints, bounces — exportable to other AWS services. Unrelated to alignment as such, they usefully complement the RUA reading: where aggregate reports say how traffic is authenticated from the recipients' point of view, SES events say what becomes of it once delivered. Cross-referencing the two sources speeds up diagnosis when a legitimate source suddenly starts to fail.
The custom MAIL FROM domain: reaching for SPF alignment
By default, the envelope address (the Return-Path, which is what SPF actually checks) is a subdomain managed by Amazon, of the form bounces+…@region.amazonses.com. SPF does authenticate that domain — Amazon publishes the right record — but it aligns with amazonses.com, not with example.com. The result: SPF passes without aligning, which, from DMARC's point of view, does not count.
The answer is the "custom MAIL FROM domain". It means declaring an envelope subdomain belonging to the sending domain — for instance mail.example.com — then placing two records in the zone:
mail.example.com. MX 10 feedback-smtp.us-east-1.amazonses.com.
mail.example.com. TXT "v=spf1 include:amazonses.com ~all"
The MX record (whose host depends on the SES region in use — here us-east-1) handles bounce processing; the TXT record authorises Amazon's servers to send for that subdomain. The envelope then becomes …@mail.example.com, a subdomain of the organisational domain: in relaxed mode — DMARC's default — it aligns with example.com. Under DMARCbis, the organisational domain is determined by the DNS tree walk rather than the old Public Suffix List, but the outcome is identical.
Is aligning SPF really worth it when Easy DKIM already makes DMARC pass? The redundancy carries real operational value: if a forward changes the sending IP and breaks SPF, DKIM survives; if a gateway rewrites the body and invalidates the DKIM signature, SPF holds. The annotated examples, tag by tag show how this block fits into the overall policy: the SES setup prepares alignment, the _dmarc record sets the instruction.
BYODKIM: keeping the key in-house
Some organisations, particularly in regulated sectors, forbid delegating a cryptographic key to a third party through DNS. SES anticipates this with BYODKIM — providing one's own DKIM key. The principle is reversed: the key pair is generated in-house, the public key is published as a TXT record under a selector the organisation chooses, and the private key is supplied to SES when configuring the identity.
selector._domainkey.example.com. TXT "v=DKIM1;k=rsa;p=MIIBIjANBgkq…"
The trade-off is clear. BYODKIM keeps full control of the key — its generation, its length, its storage — but shifts the rotation burden to the internal team: every renewal becomes a manual, coordinated operation again. For the vast majority of cases, Easy DKIM remains preferable: fewer copy errors, automatic rotation, and the same alignment result. BYODKIM is warranted when a security policy explicitly requires it, not by default.
The mistakes that make the setup fail
Several traps recur in the body of reports the free DMARC analyzer processes daily.
Stopping at identity verification. Verifying the domain in SES only grants the right to send; without Easy DKIM enabled and propagated, no aligned signature is produced. This is the most frequent cause of a DMARC failure when "everything looks configured".
Forgetting the custom MAIL FROM domain. Without it, SPF never aligns. This is not blocking as long as DKIM holds, but it removes the redundancy: the day a signature drops, nothing catches the message.
Getting the region wrong in the MX record. The feedback-smtp host is region-specific. A domain configured for eu-west-1 with an MX pointing to us-east-1 will see bounce processing fail silently.
Publishing an overly strict SPF too early. Jumping straight to -all on the MAIL FROM subdomain before confirming that traffic really leaves through SES risks rejections if another source still sends. A ~all (softfail) stays prudent during verification.
The final proof: RUA reports
The only proof that a configuration holds is not the SES console, but what recipients report. Once a _dmarc record is published with a rua= address, aggregate reports arrive within a few days and detail, source by source, what aligns and what fails. Reading the reports the receivers send back reveals whether Amazon SES traffic is correctly attributed to the domain: DKIM aligned, SPF aligned if the MAIL FROM domain was set, and above all no SES source failing both mechanisms.
A practical cadence helps: a first read a few days after publishing the _dmarc record, once several receivers have reported, then a weekly glance while the policy stays at p=none. Amazon SES traffic tends to appear under a handful of stable IP ranges, so an aligned baseline is quick to recognise — and any new, unaligned SES source stands out immediately, whether it signals a second account, a forgotten region, or a configuration that never propagated.
That verification is what licenses tightening the policy. As long as reports show legitimate SES traffic that is not aligned, moving to p=reject would cut off part of the organisation's own mail. Once alignment is confirmed over several days and across every flow — transactional and campaign alike — the move to a strict policy carries no risk. The online analyzer reconstructs this state from the published records and the reports received, and places the domain on the path that leads from p=none to p=reject.
Related guides
- Enabling DKIM on Microsoft 365: the step-by-step guide
Microsoft 365 signs with onmicrosoft.com by default — a signature DMARC cannot align. Defender portal, PowerShell, the two CNAMEs: the full walkthrough.
- Enabling DKIM on Google Workspace: the step-by-step guide
DKIM is off by default on a Google Workspace domain. Generating the 2048-bit key, publishing the google._domainkey TXT, header checks and DMARC alignment.
- Setting up SPF and DKIM on OVHcloud
OVHcloud MX Plan, Email Pro and Exchange each need their own SPF and DKIM records. The DNS zone, the default SPF trap, CNAME selectors, checks.
About the author
Thomas — Thomas is the virtual CISO of DMARC.com: a copilot specialized in email authentication that walks organizations from p=none to p=reject without breaking their mail. His guides draw on real data from the DMARC Observatory and the RUA reports the platform analyzes.
