SPF & DMARC Checker
Enter a domain and inspect the four records behind mail authentication: SPF, DKIM, DMARC and MX. SPF is expanded into a conservative lookup upper bound, so you can spot sender paths that may exceed RFC 7208’s ten-lookup limit. The direct DMARC record, alignment and report authorisation are read tag by tag; DKIM keys are probed and measured; MTA-STS, TLS-RPT and BIMI are checked too. Free, no sign-up.
- Static SPF expansion with a numbered counter for terms beyond the ten-lookup limit
- DMARC policy, subdomain policy, percentage and alignment read tag by tag
- External DMARC report addresses checked against their authorisation records
- DKIM keys probed across common selectors, with the RSA key size recovered from the record
- MX targets resolved, plus MTA-STS, TLS-RPT and BIMI in the same pass
A domain, an email address, or a full URL — only the domain part is used.
Added to the selectors always probed: 32
Overview
Four records decide whether your mail is trusted, and each one fails in its own quiet way. Every check below says what is wrong, not just what is there.
- 01
The ten-lookup budget, counted properly
Every include and redirect is followed to the end and each lookup-costing term is numbered in evaluation order, so you can see exactly which one crosses ten. Nothing about an over-limit record looks wrong until you expand it.
- 02
DMARC read tag by tag
Policy, subdomain policy, percentage and both alignment modes, with the plain meaning of each spelled out rather than left as a letter.
- 03
Report authorisation actually verified
Aggregate reports sent to another domain need that domain to opt in. The authorising record is looked up, because missing it looks identical to receiving no reports.
- 04
DKIM keys measured, not just found
The RSA modulus is recovered from the record, so a 1024-bit key that still works but is below current guidance is called out alongside revoked and test-mode selectors.
- 05
MX targets followed through
Every host is resolved, and the classic breakages — a target with no address record, a CNAME where a hostname belongs, a bare IP — are named individually.
- 06
The modern records in the same pass
MTA-STS, TLS-RPT and BIMI are checked alongside the basics, so one run covers the whole picture rather than sending you to three more pages.
How to use
One domain in, a verdict per record out. The SPF counter is the part worth reading first.
- 01
Type a domain — an email address or a full URL works too, only the domain part is used — and press Check.
- 02
Read the SPF counter first: under ten leaves room to grow, exactly ten leaves none, and a value above ten means at least one reachable sender path needs closer verification.
- 03
Open the expanded chain to see which include contributes which lookups, and which term carries the number that crosses the limit.
- 04
Check the DMARC policy and, if reports go to another domain, whether that domain has authorised them.
- 05
If no DKIM key is found, take the selector from the s= tag of a DKIM-Signature header and add it to the selectors field.
Details
Most of what breaks email authentication is invisible in the record itself. These are the cases the checks are built around.
- The SPF lookup count is a conservative upper bound across syntactically reachable branches; a particular message can stop at an earlier match
- A macro such as exists:%{i} is counted as one lookup and labelled, rather than silently ignored or wrongly expanded
- An include pointing at a domain with no SPF record is reported as a permanent error, not as a mechanism that simply did not match
- Terms after all, and a redirect that all shadows, are marked as never evaluated instead of quietly counted
- Loops are detected along the current chain, so the same include reached down two branches still costs two lookups, as receivers count it
- DKIM results say how many selectors were tried, because a miss is a limit of the method rather than a finding about the domain
Use cases
Mail authentication is usually looked at twice: while it is being set up, and the morning after something started bouncing.
-
Diagnose an SPF permanent error
A record that passed for years starts failing after one more provider is added. The counter shows how far over ten it went and which include pushed it there.
-
Check before adding a sending provider
A record sitting on nine or ten lookups has no room left. Find that out before the new include quietly breaks the existing ones.
-
Work out why DMARC reports never arrive
Aggregate reports going to an analytics vendor need an authorisation record on the vendor’s domain. Without it the reports are dropped, and the silence looks like nothing is being sent.
-
Confirm a DKIM key rotated
After rotating a selector, check the new one is published and read its size, so a 1024-bit key does not slip in where 2048 was intended.
-
Move from p=none to enforcement
See the current policy, subdomain policy and percentage in one place before turning the dial up to quarantine or reject.
-
Audit a domain you have just inherited
One run gives the whole posture — including whether a domain that should never send mail is properly locked down with -all and a null MX.
See also
To read the raw records behind these verdicts, or to trace a delegation from the root servers down, use the DNS Lookup. Mail servers present certificates too, and to check the one on a submission or IMAPS port there is the SSL Checker. And when a sending address turns up in a report and you need to know whose network it belongs to, look it up with the IP Address Lookup.
Best practices
These are the habits that keep a mail domain authenticating cleanly rather than drifting into failure.
- Keep the SPF chain a few lookups under ten, so adding a provider later does not break the record on the day it is added.
- Prefer ip4 and ip6 ranges over an include when a provider publishes stable addresses; they cost nothing against the budget.
- End the record in -all once you are confident the list is complete; ~all is the cautious step on the way there, and ?all asserts nothing at all.
- Set a DMARC aggregate address from day one, and verify the authorisation record if it points at a domain you do not control.
- Rotate DKIM selectors on a schedule and publish 2048-bit keys; retire an old selector by emptying its p tag rather than deleting the record.
- Publish a null MX and an SPF record of -all on domains that never send or receive mail, including ones you only hold defensively.
Limitations
Everything here comes from public DNS. That draws a firm line around what the result can tell you.
- DKIM selectors cannot be enumerated from DNS. A well-known set is probed, so a domain using a random selector will show no key even though DKIM is working.
- No SMTP connection is made. Port 25 is unreachable from a browser, so the MX section reports configuration, never whether a server answers.
- SPF macros cannot be expanded. They resolve differently per sending IP, so a macro is counted as one lookup and left unexpanded.
- The lookup count is a conservative upper bound across syntactically reachable paths. A given message stops at the first match, so a value over ten does not mean every sender fails.
- MTA-STS is only half visible. The TXT record is read, but the policy file lives on an HTTPS endpoint a browser cannot fetch cross-origin.
- DMARC records are read at the exact name. Receivers fall back to the organisational domain for a subdomain, which needs the public suffix list to reproduce.
- Answers come from a public resolver through the DevKitLab service, so a record published moments ago may still be cached.
FAQ
Common questions about SPF lookup limits, DMARC policy, missing DKIM keys, and what this check cannot see.
How do I check the SPF, DKIM and DMARC records for a domain?
Type the domain and press Check. The tool reads the SPF record and expands every include and redirect, reads the DMARC record at _dmarc.yourdomain, probes a set of well-known DKIM selectors, and resolves the MX hosts. Each record gets its own verdict, and MTA-STS, TLS-RPT and BIMI are checked in the same pass.
What does “too many DNS lookups” mean in SPF?
RFC 7208 allows at most ten terms that cause a DNS query during evaluation: include, a, mx, ptr, exists and the redirect modifier. Includes count recursively, so a handful of providers can quietly push the total past ten. Evaluation stops at the first mechanism that matches, so that total is a worst case rather than a verdict on every message: a sender whose path reaches beyond the tenth lookup gets a permanent error — counted as an SPF failure under DMARC — while one that matches earlier still passes. That is why an over-budget record looks perfectly normal and fails only for some senders.
How do I fix an SPF record that is over the ten-lookup limit?
Start by removing includes for providers you no longer send through — that is usually enough. Where a provider publishes stable address ranges, replace the include with ip4 and ip6 mechanisms, which cost nothing against the budget. Moving some mail to a subdomain with its own SPF record splits the budget in two. Flattening an include into literal addresses works but has to be maintained, since the provider can change its ranges without warning.
What is the difference between -all and ~all?
-all is a hard fail: a server not on the list is not authorised, and receivers may reject the message. ~all is a soft fail: unauthorised, but deliver it and mark it. ~all is the sensible setting while you are still finding stray senders; -all is where you want to end up. ?all is neutral and asserts nothing, so a record ending there does about as much as no record at all.
Why can’t the tool find my DKIM record?
Because DNS has no way to list the selectors a domain publishes. A DKIM key lives at selector._domainkey.yourdomain, and without knowing the selector name there is nothing to query. This tool probes the selectors the major providers use, but anything custom — including the random selectors Amazon SES issues — has to be supplied. Take it from the s= tag in the DKIM-Signature header of any message from the domain and add it to the selectors field.
What DMARC policy should I use, and what does p=none do?
p=none means monitor only: receivers apply no action and simply send reports. It is the right place to start, but it protects nothing, so it is a staging post rather than a destination. p=quarantine tells receivers to treat failing mail as suspicious, usually landing it in spam. p=reject refuses it outright. The usual path is none until the reports look clean, then quarantine, then reject.
Why am I not receiving DMARC reports?
The most common cause is a missing authorisation record. If your rua address is on a different domain from the one being reported on — a monitoring vendor, for instance — that domain has to publish a record at yourdomain._report._dmarc.theirdomain confirming it accepts them. Without it, conforming reporters drop the reports without telling anyone, which looks exactly like no reports being sent. This tool checks that record for every external address.
Does this check whether my mail server is actually reachable?
No. A web page cannot open an SMTP connection — port 25 is out of reach from a browser — so the MX section checks configuration only. It confirms the records exist, reads their preferences, resolves each target, and flags the usual faults: a target with no address record, a CNAME where a hostname is required, or a bare IP address. Whether a server answers on the other end needs a tool that can talk SMTP.
Why is my email going to spam even though SPF passes?
SPF passing is not the same as DMARC passing. DMARC also requires alignment: the domain that passed SPF has to match the From address a recipient sees. Mail sent through a provider often passes SPF for the provider’s own domain while the From header shows yours, which fails alignment. DKIM signing with your domain fixes it, since DKIM alignment is checked independently. Reputation, content and list hygiene sit outside authentication entirely.
What are MTA-STS, TLS-RPT and BIMI?
MTA-STS tells sending servers to require TLS when delivering to you, closing the downgrade attack that plain opportunistic TLS leaves open. TLS-RPT asks them to report when that fails. BIMI publishes a logo for receivers that display one, and requires DMARC at enforcement first. All three are optional, and not publishing them is entirely normal.
Can I check a subdomain?
Yes, and it is worth doing for any subdomain that sends mail, since SPF and DKIM are looked up at the exact name. DMARC differs: receivers fall back to the organisational domain’s record when a subdomain has none, applying its sp tag. This tool reads the exact name you enter, so an empty DMARC result on a subdomain often means the parent’s policy is what applies.
Is this the same as the DNS lookup tool?
They answer different questions. The DNS lookup tool shows you records — any type, any resolver, with a delegation trace. This one judges a specific set of them: it expands the SPF chain rather than printing one line, counts it against the limit, and reads DMARC and DKIM against the rules that govern them. Use that one to see what is published, this one to find out whether it is correct.
Related tools
See the records behind the verdicts, check the certificate on a mail port, or trace an address from a report.