Glossary

DMARC

DMARC, Domain-based Message Authentication, Reporting and Conformance, is a DNS TXT record that does two things SPF and DKIM cannot do alone: it requires authentication to align with the From: domain a recipient actually sees, and it tells receiving servers what to do when that fails. It also asks them to send aggregate reports, which are the only practical way to discover every service sending mail in your name before you start rejecting anything.

What alignment means, and why it is the point

SPF authenticates the envelope sender — a technical address the recipient never sees. DKIM signs the message with a domain's key. Either can pass while the visible From: shows a completely different domain.

DMARC requires that a passing SPF or DKIM result belongs to the same domain as the From: header. That is alignment, and it is what makes DMARC the mechanism that actually stops exact-domain spoofing.

A message can pass SPF and still fail DMARC. This surprises people, and it is the design working as intended.

The three policies

`p=none`: take no action, but send reports. This is a monitoring mode, not protection — and it is where most domains stop, which means they have the reports and none of the benefit.

`p=quarantine`: treat failing mail as suspicious, typically delivering it to spam.

`p=reject`: refuse it outright. The end state, and the only one that prevents spoofing.

`pct=` applies the policy to a fraction of messages, which is how a move to quarantine or reject is rolled out gradually.

How to get from none to reject

Publish `p=none` with a `rua=` address and collect aggregate reports for several weeks. They will name senders you did not know about — a CRM, a ticketing system, a payroll provider.

Fix each legitimate sender so it aligns: add it to SPF, or set up DKIM signing with your domain.

Move to `p=quarantine`, initially with a low `pct=`, and watch the reports.

Move to `p=reject` once the reports show only illegitimate mail failing.

Rushing this rejects your own invoices. Staying at `p=none` indefinitely protects nothing.

How to observe it

`dig _dmarc.example.com TXT +short`. The record lives on the `_dmarc` subdomain, not the apex, which is a frequent source of "we published it and nothing happened".

Check `p=`, whether `rua=` is present, and whether a `sp=` subdomain policy is set — subdomains inherit the organisational policy unless told otherwise.

What the reports actually contain

Aggregate reports arrive as gzipped XML, once a day, from each receiving provider that supports them. They are not readable without processing, which is why they are so often published and then ignored.

Each report lists source IP addresses, the volume sent from each, and whether SPF and DKIM passed and aligned. That is enough to identify every system sending in your name — which is the information nobody has before they start.

What they do not contain is message content or recipient addresses. An aggregate report is a count, not a copy.

Forwarded mail shows up as a consistent SPF failure with a DKIM pass, because forwarding rewrites the envelope and leaves the signature intact. Recognising that pattern prevents a long investigation into a non-problem.

A `ruf=` address requests per-message forensic reports instead. Few providers send them, and they can carry personal data, so most domains set `rua=` only.

Frequently asked questions

Is p=none enough?
It provides visibility and no protection. Mail failing authentication is still delivered, so a domain at p=none can be spoofed exactly as if DMARC were absent.
Why does mail fail DMARC when SPF passes?
Because of alignment. SPF authenticates the envelope sender; if that domain differs from the visible From: domain, DMARC does not count the pass. Forwarding and third-party senders commonly cause this.
Do I need both SPF and DKIM?
DMARC needs one of them to pass in alignment. In practice both are worth having: DKIM survives forwarding, which breaks SPF, so having only one leaves a predictable gap.

Sources

Related

VeriFixScan crawls a site and applies its checks to every page it reaches, keeping the evidence behind each finding. Scanning one website is free.

Scan a website