Free DMARC Checker
Look up a DMARC record and read it tag by tag, including the defaults you never set. Flags the ones that quietly matter: a missing policy, a record stuck at p=none, no reporting address, and an sp value that leaves subdomains open. No signup.
How it works
Enter a domain
We query the _dmarc subdomain for TXT records — that's where DMARC lives by spec.
Parse each tag
p, sp, pct, rua, ruf, adkim, aspf, fo, ri — annotated so you remember what each does.
Catch the gotchas
Missing 'p=', stuck at 'p=none', no rua, mixed sp/p — all surfaced.
The tags, and the defaults you did not set
A DMARC record is a TXT record at
_dmarc.yourdomain.com. Most checkers show you the tags you wrote. The ones that
matter more are usually the ones you left out, because every omitted tag still has a
value:
| Tag | Default when omitted | What it controls |
|---|---|---|
p | none (required tag) | Policy for the organisational domain. |
sp | inherits p | Policy for subdomains. |
adkim | r (relaxed) | DKIM alignment. Relaxed allows subdomains to match. |
aspf | r (relaxed) | SPF alignment. Same. |
pct | 100 | Share of failing mail the policy applies to. |
fo | 0 | Forensic report triggers. 0 means only when everything fails. |
ri | 86400 | Aggregate report interval in seconds, so daily. |
rua | none | Where aggregate reports go. Without it you are flying blind. |
The one that catches people is sp. It inherits from p, which is the safe behaviour,
right up until someone sets sp=none "for safety" while running p=reject. That
combination leaves every subdomain, including ones that do not exist, freely spoofable
while the dashboard says the domain is enforced.
"We have DMARC" usually means p=none, which enforces nothing
p=none is monitoring. It asks receivers to send you reports and to take no action on
failures, which means a message that fails both SPF
and DKIM alignment is delivered exactly as
it would be with no DMARC record at all.
This matters more than it used to. Since the 2024 bulk-sender requirements at Google and
Yahoo, any domain sending at volume needs a DMARC record, and p=none satisfies that
requirement. A very large number of domains published p=none, ticked the box and
stopped. If your record says p=none today, you have compliance and telemetry, not
protection.
The ladder out is boring and works:
| Stage | Record | How long |
|---|---|---|
| Monitor | p=none; rua=mailto:... | 2 to 4 weeks, until reports stop surprising you |
| Partial | p=quarantine; pct=25 then 50, 100 | 1 to 2 weeks per step |
| Enforce | p=reject | Steady state |
pct is what makes this safe: at pct=25 the policy applies to a quarter of failing
mail, so a forgotten sender shows up as a trickle of complaints rather than an outage.
Note that pct was removed in the newer DMARCbis work, so treat it as a rollout tool
you stop relying on rather than a permanent setting.
Why your reports never arrive
Two causes, and the second one is invisible without knowing to look for it.
The mailbox cannot handle the volume. Aggregate reports are gzipped XML sent once
per day per reporting receiver. For a domain of any size that is a lot of attachments
landing in a human inbox. Point rua at a parser, not at a person.
Cross-domain reporting is not authorised. If your rua address is at a different
domain from the policy, RFC 7489 requires that other domain to opt in by publishing an
authorisation record. Point rua at dmarc@reports.vendor.com for policy domain
example.com and the vendor must publish:
example.com._report._dmarc.reports.vendor.com TXT "v=DMARC1"
Without it, conforming receivers silently drop the reports. Nothing errors, nothing
bounces, the reports simply never come. Vendors normally create this for you when you
onboard, but a hand-rolled rua pointing at your own second domain will not have it.
Alignment is the whole point
DMARC does not check whether SPF or DKIM passed. It checks whether the domain that
passed matches the domain the recipient sees in the From: header. That is
alignment, and it is why a message can pass SPF cleanly and
still fail DMARC: the envelope sender was your bulk provider's bounce domain, not yours.
Relaxed alignment (the default) lets mail.example.com align with example.com.
Strict requires an exact match. Almost everyone should stay relaxed; strict mainly
breaks subdomain senders you forgot about.
If a sender fails alignment, the fix is at the sender: give it a custom return-path or a DKIM key on your own domain. Check what you have now with the SPF checker and the DKIM record checker.
One incentive for finishing the ladder: BIMI, which
puts your logo next to your mail in supporting clients, requires p=quarantine or
p=reject. p=none does not qualify.
From the command line
Keyless, no signup:
curl -s "https://api.domainee.dev/v1/tools/dmarc-record-checker?domain=example.com" | jq
Returns the raw record, the parsed tags and an issues array by severity. Rate limits
are per IP and there is no uptime commitment, so it suits scripts and audits rather than
a production dependency.
Domainee is a custom domains API for SaaS with a native MCP server, 50 domains and 100 GB free. Mail authentication and web custom domains are separate problems; this tool covers the first.
Frequently asked questions
Where should I start with DMARC?+
Publish p=none with a rua= report mailbox, monitor for a few weeks, then move to p=quarantine and finally p=reject. Skipping p=none risks breaking legitimate mail flows you didn't know about.
Is p=none enough?+
It's enough to satisfy the bulk-sender requirements at Google and Yahoo, and it's enough to get you reports. It enforces nothing: a message failing both SPF and DKIM alignment is delivered exactly as it would be with no DMARC record at all. Treat p=none as the first rung, not the destination.
Why am I not receiving DMARC reports?+
Usually one of two things. Either rua points at a human mailbox that can't cope with daily gzipped XML from every reporting receiver, or the rua address is on a different domain from the policy and that domain hasn't published the authorisation record RFC 7489 requires (policydomain._report._dmarc.otherdomain TXT "v=DMARC1"). Without it, conforming receivers drop the reports silently.
Why does pct=100 matter?+
pct controls how much of failing mail the policy applies to, so lower values limit blast radius during rollout. 100 is the default and the correct steady state. Note that pct is being removed in the DMARCbis revision, so use it as a rollout tool rather than a permanent setting.
Does DMARC require SPF and DKIM?+
DMARC needs at least one to pass — and the passing record must align with the From: domain. Most real deployments use both for redundancy.
What does 'alignment' mean?+
Alignment is whether the domain that authenticated (via SPF or DKIM) matches the From: header domain. Strict means exact match, relaxed allows subdomains. Most senders use relaxed. It's the reason a message can pass SPF and still fail DMARC: the envelope sender was your provider's bounce domain rather than yours.
What happens to my subdomains?+
The sp tag governs them, and when it's omitted it inherits p. That's the safe default. The dangerous configuration is p=reject with sp=none, which reads as cautious but leaves every subdomain (including ones that don't exist) open to spoofing while your domain shows as enforced.
Building a SaaS that needs custom domains?
Domainee is the API for adding customer custom domains to your product. One CNAME, automatic TLS, no DevOps to staff.
50 custom domains and 100 GB bandwidth free, forever.
More free tools
SSL
Free SSL Certificate Checker
View issuer, validity, expiration countdown, and certificate chain for any domain.
DNS
Free DNS Record Lookup
Check A, AAAA, CNAME, MX, TXT, NS, and SOA records for any domain instantly.
Domain
Free WHOIS Lookup
View registrar, creation and expiry dates, name servers, and registration data for any domain.
DNS
Free CNAME Lookup & Generator
Validate CNAME records and get provider-specific setup instructions for custom domains.
HTTP
Free HTTP Header Checker
Inspect response headers, security headers, caching, redirects, and get a security grade for any URL.
DNS
Free DNS Propagation Checker
Query DNS servers across multiple global locations to verify your DNS changes are live.