SPF DKIM DMARC Checker for Resend and Cloudflare
A free SPF DKIM DMARC checker with presets for Resend, Cloudflare Email, Google and Microsoft 365. Reads the right hosts, counts SPF lookups, explains fixes.
- Asks Cloudflare DNS
- Falls back to Google DNS
Checked
01Tool
Tool
Enter a domain and pick the provider that sends its mail. The checker reads the records that provider needs and explains each result.
02Guide
How it works
What each record proves
SPF lists the servers allowed to send mail for a domain. Receivers check it against the domain in the return path, the envelope sender a bounce goes back to, not the From address people see.
DKIM signs each message with a private key. The public half sits in DNS at <selector>._domainkey.<domain>, and a valid signature proves the message left a server holding that key and wasn't changed on the way.
DMARC ties both to the From address. A message passes when SPF or DKIM passes for a domain that aligns with From, and the DMARC record tells receivers what to do with mail that doesn't and where to send reports about it.
Why your SPF record is on a subdomain
Transactional providers handle bounces themselves, so they put a subdomain of yours in the return path. Resend uses send.<domain> unless you chose another name when you added the domain, and Cloudflare Email Sending uses cf-bounce.<domain>. Receivers look up SPF on that host, so that is where the provider asks for SPF and an MX record, and a checker that reads only the bare domain reports a failure that isn't there.
Google Workspace and Microsoft 365 send with your own address as the return path, so their SPF belongs on the domain itself. Amazon SES uses a subdomain of amazonses.com until you set a custom MAIL FROM domain. Until then SPF passes for Amazon rather than for you, and DMARC has to rely on DKIM.
The SPF lookup limit
Every include, a, mx, ptr, exists and redirect costs a DNS lookup when a receiver evaluates the record, and so does every such term inside the records you include. Past the limit in the table below, receivers stop with a permanent error and SPF fails for every message. Lookups that find nothing have a smaller limit of their own.
The checker follows each include and redirect through DNS and adds them up the way a receiver does. a, mx, ptr and exists count without being resolved. If a record is close to the limit, move a sender to its own subdomain rather than replacing its include with addresses that will change under you.
DMARC after RFC 9989
RFC 9989, published in May 2026, replaces RFC 7489 and puts DMARC on the standards track. Three tags are gone: pct, rf and ri. Receivers ignore them, and the checker points them out. pct was mostly used as pct=0, which some forwarders took as a cue to rewrite the From header. That job now belongs to t=y, which asks receivers to apply the policy one level down.
Two tags are new. np sets the policy for subdomains that don't exist, and psd lets a domain say where its organizational boundary is. Receivers no longer need a public suffix list: when a domain has no record of its own, they walk up the DNS tree to find one. The checker does the same and shows which name the policy came from.
Alignment
DMARC passes only when SPF or DKIM passes for a domain that matches the From address. Relaxed alignment, the default, accepts any domain under the same organizational domain, so a return path of send.example.com aligns with mail from example.com. Strict alignment, aspf=s or adkim=s, wants the exact domain. A provider's bounce subdomain then fails SPF alignment and leaves DKIM to carry DMARC. The DKIM keys these providers ask you to publish sit under your own domain, so DKIM aligns in either mode.
Set up your provider
Resend lists its records on the domain's page and can add them to Cloudflare DNS for you (Resend docs). Cloudflare Email Service adds its sending records under cf-bounce and its routing records on the domain itself when you onboard the domain, and it adds a DMARC record too (Cloudflare docs). Read what that record says before you change it, and use the DMARC record generator to build the next stage.
03Rates
The numbers it uses
| Item | Limit | Source |
|---|---|---|
| SPF DNS-querying terms, at most include, a, mx, ptr, exists and redirect, through every include | 10 | rfc-editor.org |
| SPF lookups that find nothing, recommended limit | 2 | rfc-editor.org |
| DKIM RSA key, minimum | 1,024 bits | rfc-editor.org |
| DKIM RSA key, recommended | 2,048 bits | rfc-editor.org |
| DMARC policy lookups per message, at most | 8 queries | rfc-editor.org |
| Item | Record | Source |
|---|---|---|
| Resend, SPF | send.<domain> include:amazonses.com | resend.com |
| Resend, DKIM | resend._domainkey | resend.com |
| Cloudflare Email Sending, SPF | cf-bounce.<domain> include:_spf.mx.cloudflare.net | developers.cloudflare.com |
| Cloudflare Email Sending, DKIM | cf-bounce._domainkey | developers.cloudflare.com |
| Cloudflare Email Routing, SPF | <domain> include:_spf.mx.cloudflare.net | developers.cloudflare.com |
| Cloudflare Email Routing, DKIM | cf2024-1._domainkey | developers.cloudflare.com |
| Google Workspace, SPF | <domain> include:_spf.google.com | knowledge.workspace.google.com |
| Google Workspace, DKIM | google._domainkey | knowledge.workspace.google.com |
| Microsoft 365, SPF | <domain> include:spf.protection.outlook.com | learn.microsoft.com |
| Microsoft 365, DKIM | selector1._domainkey, selector2._domainkey | learn.microsoft.com |
| Amazon SES, SPF | MAIL FROM host include:amazonses.com | docs.aws.amazon.com |
| Amazon SES, DKIM | Three CNAMEs named by SES tokens | docs.aws.amazon.com |
| Postmark, SPF | pm-bounces.<domain> CNAME pm.mtasv.net | postmarkapp.com |
| Postmark, DKIM | Shown in Postmark's DNS Settings | postmarkapp.com |
04Questions
Questions
- What do SPF, DKIM and DMARC check?
- SPF checks that the server sending a message is allowed to send for the domain in its return path. DKIM checks a signature that proves the message came from a holder of the domain's key and wasn't changed. DMARC checks that one of the two passed for a domain matching the From address, and tells receivers what to do when neither did.
- Why does my SPF check fail when I send with Resend?
- Most checkers read SPF on your bare domain, but Resend puts its own subdomain in the return path, send.<domain> unless you picked another name. Receivers read SPF there, so that is where Resend asks for the record. Choose the Resend preset and this checker reads the same host.
- What is the SPF DNS lookup limit?
- SPF caps how many DNS-querying terms a receiver will evaluate for one record, counting every include, a, mx, ptr, exists and redirect, and every such term inside the records you include. Past the cap, receivers return a permanent error and SPF fails for all your mail. The table on this page gives the number, and the checker counts your record against it.
- Can you find my DKIM selector?
- No checker can. DNS answers only the names you ask for and has no way to list a domain's selectors. The presets know the fixed selectors Resend, Cloudflare, Google and Microsoft use; for any other provider, copy the selector from the records it asked you to publish.
- Is the DMARC pct tag still valid?
- No. RFC 9989 removed pct, along with rf and ri, and receivers following it ignore them. If you used pct=0 to test a policy, publish t=y instead.
- Which DMARC policy should I start with?
- Start with p=none and a rua address, so you get reports without changing delivery. Once the reports show every sender passing, move to quarantine with t=y, then quarantine, and then reject the same way. The DMARC record generator writes each stage.
05Sources
Sources
Every fact on this page was read from these pages on .
- RFC 7208, Sender Policy Framework (SPF)rfc-editor.org/
rfc/ rfc7208 - RFC 6376, DomainKeys Identified Mail (DKIM) Signaturesrfc-editor.org/
rfc/ rfc6376 - RFC 8301, Cryptographic Algorithm and Key Usage Update to DKIMrfc-editor.org/
rfc/ rfc8301 - RFC 8463, A New Cryptographic Signature Method for DKIMrfc-editor.org/
rfc/ rfc8463 - RFC 9989, Domain-Based Message Authentication, Reporting, and Conformance (DMARC)rfc-editor.org/
rfc/ rfc9989 - RFC 9990, DMARC Aggregate Reportingrfc-editor.org/
rfc/ rfc9990 - RFC 7505, A "Null MX" No Service Resource Recordrfc-editor.org/
rfc/ rfc7505 - Resend docs, Cloudflareresend.com/
docs/ knowledge-base/ cloudflare - Resend docs, Configure a custom Return Pathresend.com/
docs/ dashboard/ domains/ custom-return-path - Cloudflare Email Service docs, Domain configurationdevelopers.cloudflare.com/
email-service/ configuration/ domains/ - Cloudflare Email Service docs, Email authenticationdevelopers.cloudflare.com/
email-service/ concepts/ email-authentication/ - Google Workspace Admin Help, Set up SPFknowledge.workspace.google.com/
admin/ security/ set-up-spf - Google Workspace Admin Help, Set up DKIMknowledge.workspace.google.com/
admin/ security/ set-up-dkim - Microsoft Learn, Set up SPF for your Microsoft 365 domainlearn.microsoft.com/
en-us/ defender-office-365/ email-authentication-spf-configure - Microsoft Learn, How to use DKIM for email in your custom domainlearn.microsoft.com/
en-us/ defender-office-365/ email-authentication-dkim-configure - Amazon SES docs, Using a custom MAIL FROM domaindocs.aws.amazon.com/
ses/ latest/ dg/ mail-from.html - Amazon SES docs, Creating and verifying identitiesdocs.aws.amazon.com/
ses/ latest/ dg/ creating-identities.html - Postmark, Adding a custom Return-Path domainpostmarkapp.com/
support/ article/ 910-adding-a-custom-return-path-domain - Postmark, How do I set up DKIM for Postmark?postmarkapp.com/
support/ article/ 1091-how-do-i-set-up-dkim-for-postmark - Cloudflare 1.1.1.1 docs, DNS over HTTPS with JSONdevelopers.cloudflare.com/
1.1.1.1/ encryption/ dns-over-https/ make-api-requests/ dns-json/ - Google Public DNS, JSON API for DNS over HTTPSdevelopers.google.com/
speed/ public-dns/ docs/ doh/ json
Found something out of date? Tell us.
Nuxter
Building a SaaS on Nuxt?
Nuxter sends its sign-in links, password resets and account notices through Cloudflare Email Service or Resend. The presets here check the records each of them needs, so you can fix them before the first message goes out.