DMARC reference
What is a DMARC record?

By Samuel Chenard · CEO & Co-Founder, Palisade · Reviewed August 21, 2026
A DMARC record is a single DNS TXT record published at _dmarc.yourdomain.com. It tells receiving mail servers what to do with messages that claim to come from your domain but fail SPF and DKIM alignment, and where to send reports about them. It is a list of tag=value pairs separated by semicolons, it always starts with v=DMARC1, and a domain may publish exactly one.
| DMARC record at a glance | |
|---|---|
| Record type | DNS TXT |
| Host | _dmarc.yourdomain.com |
| Shortest valid record | v=DMARC1 |
| Typical record | v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com |
| Per domain | Exactly one. Two records read as none. |
| Depends on | SPF and DKIM. DMARC evaluates their results, it performs no check of its own. |
| Current spec | RFC 9989, published May 2026, which retired three tags. |
What a DMARC record looks like
Every DMARC record is the same shape: a version, a policy, and then optional tags that adjust reporting and alignment. These four are all valid, and each one is appropriate at a different point in a rollout.

Monitoring, the record a first setup starts on
v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.comNothing is blocked. Receivers deliver as before and report daily on every source sending as the domain, which is the evidence every later decision depends on.
Enforcement, the record a finished rollout ends on
v=DMARC1; p=reject; rua=mailto:dmarc@yourdomain.comMail that fails authentication is refused rather than delivered. Safe only once reports show every legitimate sender passing SPF or DKIM with alignment.
Parent enforcing, a sending subdomain still testing
v=DMARC1; p=reject; sp=none; rua=mailto:dmarc@yourdomain.comThe sp tag gives subdomains their own policy, so a subdomain whose senders are not sorted out yet can stay at monitoring while the parent domain enforces.
The shortest record that is still valid
v=DMARC1The version tag alone parses, and receivers treat the missing policy as p=none. Practically useless either way: with no rua address nothing reports back, so the record produces no evidence and the rollout cannot progress.
The mistake that disables the policy
One record, amended
v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.comOne record carrying the new policy. Changing a policy means editing the value inside the record you already publish.
Two records at _dmarc
v=DMARC1; p=none; rua=mailto:old@yourdomain.com
v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.comPublishing a second record instead of amending the first. Receivers that find two at _dmarc treat the domain as having no usable policy, so this disables both rather than replacing one.
Every tag, and what it does
Only v is required, and it is the only tag with a fixed position: it must come first or the whole record is ignored. Everything else is optional, including the policy tag, and a record with no p is read as though it said p=none.
DMARC record tags
| Tag | Status | What it controls |
|---|---|---|
| v | Required, and must come first | Protocol version. The only valid value is DMARC1. A record that does not begin with it is ignored entirely. |
| p | Recommended | The policy receivers apply to mail that fails authentication: none to monitor, quarantine to send to spam, reject to refuse. A record that omits it is read as though it said p=none. |
| rua | Strongly recommended | Where daily aggregate reports are sent, as a mailto: URI. Without it the record publishes but produces no evidence about who sends as your domain. |
| ruf | Optional, rarely useful | Where per-message failure samples are sent. Most large receivers, Gmail included, do not send them, and the samples can carry message content. |
| sp | Optional | A separate policy for subdomains. Without it, subdomains inherit the p value, so sp is how a parent domain enforces while a sending subdomain stays at monitoring. |
| np | Optional | A policy for subdomains that do not exist in DNS at all, which is what spoofers reach for once the real names are protected. |
| adkim | Optional, defaults to relaxed | How closely the DKIM signing domain must match the From domain. r accepts a subdomain match; s requires an exact one. |
| aspf | Optional, defaults to relaxed | The same alignment control for SPF. Relaxed suits nearly every domain, because legitimate services routinely send from subdomains. |
| fo | Optional | Which failure conditions generate a ruf report. Only meaningful if you publish a ruf address and your receivers actually send them. |
| t | Optional, defaults to n | Test mode. t=y asks receivers not to apply the policy yet while still sending reports, which is the RFC's named replacement for part of what pct used to do. |
| psd | Optional | Marks the domain as a public suffix domain. Relevant to registry operators rather than to an ordinary sending domain. |
| pct | Removed by RFC 9989 | Applied the policy to a percentage of failing mail. Receivers sampled inconsistently; omit it from new records. |
| rf | Removed by RFC 9989 | Named the failure report format. Only one format was ever in real use. |
| ri | Removed by RFC 9989 | Requested an aggregate reporting interval. Receivers sent daily reports regardless. |
The last three are the ones worth knowing about, because older guides still recommend them. pct, rf and ri were part of RFC 7489 and were removed by RFC 9989 in May 2026. A record that still carries them is not broken, but new records should leave them out.
Where the record lives
A DMARC record lives in public DNS, at the _dmarc host, published by whichever provider answers for the domain's nameservers. Two details cause most of the confusion here.
The first is that your mail platform is not where the record goes. Microsoft and Google both document DMARC thoroughly, which leads people to look for a setting in the admin console. There is not one: the record is a DNS entry, and the admin console is where DKIM signing gets turned on beforehand.
The second is that the registrar is not always the DNS host. Buying a domain at GoDaddy does not mean GoDaddy answers for it, and a record saved at the registrar while another provider hosts the zone will never resolve. Running dig NS yourdomain.com settles it in one lookup.
Read a domain's DMARC record
Queries _dmarc for any domain and parses every tag, including the retired ones, so you can see exactly what is published rather than what someone believes is published.
How does a DMARC record work?
When a message arrives, the receiver checks SPF and DKIM, then looks up the DMARC record for the domain in the From header. The check that matters is alignment: SPF or DKIM passing is not enough on its own, because either can pass for a domain the recipient never sees. DMARC asks whether the domain that passed is the domain being displayed.
If at least one of them passes and aligns, the message passes DMARC and the policy is irrelevant. If neither does, the receiver applies p, and either delivers the message anyway (none), files it as spam (quarantine), or refuses it (reject). Either way it counts the result and includes it in the daily report sent to your rua address.
That last part is why a record with no reporting address is a wasted publication. The policy tells receivers what to do; the reports tell you whether it is safe to ask. Setting DMARC up end to end walks the sequence, and what DMARC is covers the protocol behind it.

DMARC software that does the work
A published record is the beginning of the work. Palisade's agent reads the aggregate reports the record generates, names every service sending as your domain, drafts the SPF and DKIM fixes each one needs, and proposes the next policy step when the evidence supports it. You review and approve every change before it ships.
1 domain free up to 1,000 emails/month
Questions readers ask
Frequently asked questions
Keep reading
v=DMARC1spnpadkim / aspffo