CertaDNS
Skip to lesson

DMARC Fundamentals · lesson 2 of 3

The policy record, tag by tag

After this lesson you can

Read any DMARC record and state exactly what it asks receivers to do.

Assumes you have read The gap SPF and DKIM leave open.

The DMARC record is a TXT record at _dmarc under the domain. It is a short list of tags, and every one of them changes what receivers do. Three real records, then each tag in turn.

Three records, read as policy statements

$ dig +short TXT _dmarc.github.com
"v=DMARC1; p=quarantine; sp=reject; pct=100; rua=mailto:dmarc@github.com; ruf=mailto:dmarc@github.com; fo=1"
Checked 2026-09-12. Quarantine on the main domain, but reject on every subdomain.
$ dig +short TXT _dmarc.bbc.co.uk
"v=DMARC1;p=reject;aspf=s;adkim=s;pct=100;fo=0;ri=86400; rua=mailto:dmarc_agg@vali.email;"
Checked 2026-09-12. Full enforcement, and strict alignment on both protocols — an unusually tight configuration.
$ dig +short TXT _dmarc.paypal.com
"v=DMARC1; p=reject; rua=mailto:d@rua.agari.com,mailto:dmarc_agg@vali.email; ruf=mailto:d@ruf.agari.com,mailto:MTc4Mzcw@ruf.vali.email"
Checked 2026-09-12. Reject, with reports going to two independent destinations.

The tags

v=DMARC1; p=quarantine; sp=reject; adkim=r; aspf=r; pct=100;
rua=mailto:agg@example.com; ruf=mailto:forensic@example.com;
fo=1; ri=86400
  1. v=DMARC1 — required, and must be first. Without it the record is not a DMARC record.
  2. p= — the policy: none, quarantine or reject. Required.
  3. sp= — policy for subdomains. If absent, subdomains inherit p=.
  4. adkim=, aspf=alignment mode, r relaxed (default) or s strict.
  5. pct= — apply the policy to this percentage of failing messages. Defaults to 100.
  6. rua= — where to send aggregate reports.
  7. ruf= — where to send per-message failure reports.
  8. fo= — when to generate failure reports. 1 means any failure, not only total failure.
  9. ri= — requested reporting interval in seconds. Defaults to 86400, and receivers largely ignore anything else.

The three policies

PolicyAsks receivers toUse it when
p=noneDo nothing differently — but still send reports.You are discovering your senders. This is monitoring, not protection.
p=quarantineTreat failing mail as suspicious. In practice, spam folder.You believe your inventory is complete and want a survivable first step.
p=rejectRefuse failing mail at SMTP time.You are confident. Failing mail bounces rather than landing in a folder someone might check.

p=none protects nothing

It is a monitoring request. A domain sitting at p=none is exactly as spoofable as a domain with no DMARC record at all — the only difference is that the owner now receives reports about it. That is genuinely valuable, and it is not protection. Domains that published p=none years ago and stopped there have the paperwork and none of the benefit.

pct, and why it disappoints

pct=25 asks receivers to apply the policy to a quarter of failing messages and treat the rest as the next weaker policy. It is designed as a ramp.

In practice it is a blunt instrument. The sampling is per-message and per-receiver, so a single sender does not fail consistently — it fails a quarter of the time, which makes problems intermittent and much harder to diagnose than a clean failure. It is genuinely useful for the reject step, where the difference between a bounce and a spam folder is material; below that, moving p= is usually clearer than tuning pct.

sp, the tag worth setting early

Subdomains inherit p= unless sp= says otherwise. That default matters because organisations have many subdomains that send no mail at all, and an attacker will happily use invoices.example.com if nothing stops them.

GitHub’s record above is a good pattern: p=quarantine on the main domain, which has real senders and real risk of a false positive, and sp=reject on subdomains, where there is much less to break. Setting sp=reject is often the earliest meaningful enforcement an organisation can safely take.

rua, and the record that makes it work

Aggregate reports are the point of deploying DMARC at all. One detail sinks a great many deployments: if the reporting address is at a different domain from the one being reported on, that other domain must publish a record authorising it — RFC 7489 §7.1. Without it, conforming receivers drop the reports silently, the DMARC record looks perfect, and nothing ever arrives.

This is common enough, and subtle enough, that it has its own reference article; the link is at the end of this lesson.

  • Multiple destinations are allowed, comma-separated. PayPal’s record above sends to two.
  • Reports are XML, gzipped, sent by email, typically daily. They contain counts and source addresses — never message content.

Try it on a real domain

Free, no account, public DNS only.

Go deeper

Last reviewed