The short version
Three records, three jobs
SPF says who may send as your domain. DKIM proves the message was signed by it. DMARC tells receivers what to do when the first two fail — and where to report it. You can check all three at once with the free SPF, DKIM and DMARC checker: it runs against live DNS and names the problems, not just the records.
| Record | What it proves | Fix first when it fails |
|---|---|---|
| SPF | Which servers may send mail as your domain | One record only, ending in -all or ~all, under the 10-lookup limit |
| DKIM | That a message was signed by your domain and not altered on the way | A non-empty public key at the selector your provider actually uses |
| DMARC | What receivers do when SPF or DKIM fail — and who gets the reports | A monitoring policy (p=none) with a rua address, then enforcement |
None of the three is about your copy. All three are about whether a server has a reason to trust the envelope the copy travels in — which is why they are checked before anything else when replies stop arriving.
SPF: who may send
TXT record at the domain itself
v=spf1 include:_spf.mx.cloudflare.net ~all — a list of mechanisms, read left to right, ending in a policy for everyone else.
SPF is a single TXT record at the root of your domain. Receivers check the sending server's IP against it: a match returns a pass, a mismatch returns the qualifier on the all mechanism. The qualifiers are not decoration — they are the whole point:
| Ending | Meaning | When it is the right choice |
|---|---|---|
-all | Hard fail: servers not listed are not authorized | Once every legitimate sender is listed. The destination state. |
~all | Soft fail: mark as suspicious but do not reject | While the list of senders is still being completed — a transition, not a destination. |
?all | Neutral: no claim at all | Almost never. It gives receivers nothing to act on. |
+all | Pass for everyone | Never. It authorizes the entire internet to send as your domain. |
Two rules cause most SPF failures in the wild. First, only one SPF record may exist: if two TXT records start with v=spf1, receivers may ignore both. It happens when two services each add "their" record — a registrar here, a marketing tool there. Second, SPF has a limit of 10 DNS lookups per evaluation; mechanisms like include, a, mx, exists and redirect each cost one, and a record that exceeds the limit fails with permerror regardless of how correct it looks. The deprecated ptr mechanism is best replaced with an include.
What good looks like: one record, the senders you actually use, a lookup count with headroom, and an all that matches your stage — ~all while you finish, -all when you are done.
DKIM: the signature
TXT (or CNAME) record at <selector>._domainkey.<domain>
v=DKIM1; k=rsa; p=MIIBIjANBg… — a public key your server uses to sign, and receivers use to verify.
DKIM is what survives forwarding. The sending server signs each message with a private key; the matching public key is published in DNS at a selector — an arbitrary label chosen by whoever signs. That freedom is the source of most DKIM confusion: there is no standard selector to look up, so "no record found" usually means "the right selector was not tried", not "DKIM is missing".
Common selectors by provider, worth trying in the checker:
| Provider | Typical selector |
|---|---|
| Google Workspace | google |
| Microsoft 365 | selector1, selector2 |
| Cloudflare Email Routing | cf2024-1 and similar dated selectors |
| Most sending platforms | The selector shown in the platform's DNS setup page — copy it exactly |
Three failure modes are worth knowing. A record with an empty key (v=DKIM1; p=) is not a working DKIM record — it is a placeholder, sometimes published as a wildcard to stop people from testing against a domain they do not own. example.com does exactly this: every common selector resolves to v=DKIM1; p=, and a checker that only looks for "a DKIM record" will wrongly call it a pass. A CNAME-based setup (common with hosted providers) points the selector at the provider's key; following the CNAME is what makes the check real. And a rotated key — providers rotate selectors on their own schedule — means the selector that worked last year may be retired; if signatures suddenly fail, check the current selector before anything else.
What good looks like: a key with an actual p= value, at the selector your provider signs with, verified by following the chain (TXT or CNAME) to a non-empty key.
DMARC: what to do with failures
TXT record at _dmarc.<domain>
v=DMARC1; p=none; rua=mailto:[email protected] — a policy for failures, and an address for reports.
DMARC is the instruction layer: it tells receivers what to do when a message claiming to be from your domain fails SPF or DKIM, and it requires those results to be aligned — the domain that passed must match the visible From domain, not just some domain in the path. It also gives you reporting: rua addresses receive aggregate reports of who is sending as you, every day.
| Tag | What it does | Practical advice |
|---|---|---|
p=none | Monitor only: failures are delivered | The correct starting point — you cannot enforce what you have not measured. |
p=quarantine | Failures go to spam | The middle step once reports show all legitimate senders passing. |
p=reject | Failures are rejected outright | The destination state — and unforgiving if anything legitimate is still unaligned. |
rua= | Aggregate reports to your address | Add it from day one; reports are how you find forgotten senders. |
pct= | Applies the policy to a percentage of mail | Useful mid-transition, never as a resting place. |
sp=, adkim=, aspf= | Subdomain policy and alignment strictness | Defaults are usually fine; revisit when subdomains send mail. |
The mistake to avoid is jumping to p=reject because a tutorial says so. Enforcing before every legitimate sender — invoices, password resets, your CRM, the tool a team member connected two years ago — passes alignment means those messages start failing. The ladder exists for a reason: none → quarantine → reject, each step taken after the reports justify it.
The order to fix them in
The three records depend on each other in one direction: DMARC interprets SPF and DKIM, so fixing them out of order means enforcing a policy over results you have not corrected yet. The sequence that works:
- SPF first. It is the fastest to fix — merge duplicates, remove
+all, count lookups, choose the rightall— and it is the record most often broken by accident. - DKIM second. The work is identifying the selector your provider actually signs with and publishing a real key. Nothing to enforce yet; just make signing possible.
- DMARC third. Start at
p=nonewithrua. Read the reports for a couple of weeks. Move toquarantine, thenreject, only when the reports show every legitimate sender aligned. - Then re-check. Run the checker after each change — remember DNS changes take minutes to hours to appear depending on TTL — and again after any new tool starts sending as your domain.
One more habit: whenever a new service starts sending as you (a support desk, a billing tool, a campaign platform), add its sender to SPF and its selector to DKIM before tightening DMARC further. Most "DMARC broke my email" incidents are this, in reverse.
Reading the checker's statuses
The checker reports each record as PASS, REVIEW or FIX, with the findings spelled out. The distinctions matter more than the colors:
- SPF PASS — one record, a sane lookup count, an
allthat matches reality. REVIEW — technically valid but soft:~allwhile you could harden, or a deprecated mechanism. FIX — missing, duplicated,+all, or over the lookup limit. - DKIM PASS — a non-empty key found (directly or through a CNAME). REVIEW — no key at the common selectors: usually just the selector question. FIX — empty keys found, i.e. placeholders rather than signing keys.
- DMARC PASS — an enforcing policy with reporting. REVIEW —
p=none, or missingrua: monitoring states that are correct at the start and incomplete at the end. FIX — missing or duplicated record.
A normal early state for a new domain reads SPF PASS · DKIM REVIEW · DMARC REVIEW: the foundation is there, the provider selector needs confirming, and DMARC is in its monitoring phase. That is not a failure — it is a to-do list in the right order.
FAQ
Is SPF alone enough?
No. SPF only lists which servers may send as your domain, and it breaks on forwarding. DKIM signs the message so it survives forwarding, and DMARC ties both to the From domain and tells receivers what to do with failures. The three work as a set.
Why does my DKIM result show REVIEW?
Because DKIM lives at a selector chosen by your provider, and common selectors may not include it. Enter your provider's selector in the checker to test it directly — for example google for Google Workspace, selector1 or selector2 for Microsoft 365, or the selector shown in your sending provider's dashboard.
Can I set DMARC to p=reject immediately?
Only when every legitimate sender is covered by SPF or DKIM alignment. Reject before that will block legitimate mail — invoices, notifications, your own transactional email. The safe path is p=none with rua reports first, then quarantine, then reject.
What does a DKIM record with an empty key (p=) mean?
It means there is no usable public key at that selector — often a placeholder or a wildcard record, like the one example.com publishes. Messages cannot be verified against it. Check the selector your provider actually uses.
How long do DNS changes take to show up?
Usually minutes, sometimes hours, depending on the TTL of the records you changed and resolver caches. If the checker still shows the old state, re-run it later; the result is always a snapshot of public DNS at that moment.
Does TOM configure these records?
Yes. When you create a mailbox in TOM, the domain's SPF, DKIM and DMARC records are configured for you as part of the mailbox setup, and sending follows a progressive warmup from 1 to 25 emails per day per mailbox.
Available now
Check the records, then send with control
Run the free SPF, DKIM and DMARC checker on any domain in one pass. When you are ready to send, TOM configures these records when you create a mailbox, verifies every contact with a green/yellow/red light, and paces sending with progressive warmup from 1 to 25 emails per day — $19 per mailbox/month, AI copy included, no platform-access fee. Domains and verification credits are separate.
Start the machineThis guide is part of the TOM blog. Run the free SPF, DKIM and DMARC checker. Related reading: the 12 cold email frameworks, verification colors explained and 12 cold email software alternatives compared.