DMARC policy none quarantine reject: what receivers do with each, and when to move up
Published Updated 11 min readBy the Rasket team

What a DMARC policy is
A DMARC policy is the p= tag in a domain’s DMARC record: the instruction a receiving server reads when a message claiming to be from that domain fails authentication. Searching for “DMARC policy none quarantine reject” usually comes down to one question: which of the three values should I publish, and when? The short answer is all three, in that order, at a pace your reports justify.
The record lives at _dmarc. followed by your domain, as a TXT record. A receiver that sees a message with your domain in the From header looks that record up, checks whether SPF or DKIM passed with an aligned domain, and if neither did, applies the policy. It then counts what it saw and, once a day, mails you a summary. That loop — policy out, reports back — is the whole design, and it is why the value you publish first is the one that does nothing.
This post assumes you know what SPF, DKIM and alignment are. The three-records explainer covers those, and the alignment entry in the glossary is the one-paragraph version. Here we stay on the policy value, the tags around it, and the reports that tell you when to move up.
The three values: none, quarantine, reject
The three values are a ladder, and every rung is defined in RFC 7489 as a request rather than a command: a receiver may apply local policy over yours. In practice the large mailbox providers honour the request, and the differences between the rungs are exactly what the table says.
| p=none | p=quarantine | p=reject | |
|---|---|---|---|
| What receivers do with a failing message | Deliver it as they would have anyway, and report it. | Treat it as suspicious. In practice: the spam folder, or a lower trust score. | Refuse it during the SMTP conversation. The recipient never sees it. |
| Risk to legitimate mail | None. Nothing changes. | Real. A legitimate stream you have not aligned lands in spam. | Highest. A legitimate stream you have not aligned disappears, with a bounce to the return path if you are lucky. |
| What you learn | Everything: every source sending as your domain, with pass and fail counts. | The same reports, plus the disposition receivers actually applied. | The same reports. Spoofed mail now shows a reject disposition. |
| When to use it | First. Immediately. Every domain you own, including the ones that send nothing. | Once every legitimate stream in the reports passes with alignment. | Once quarantine has run at pct=100 for a few weeks without surprises. |
| Best for | Discovering what sends as you. | Catching stragglers while your reputation carries most mail through. | Stopping impersonation of your domain, which is the reason DMARC exists. |
Two things the table hides. First, a p=none record is not nothing to a receiver: Google’s sender guidelines require bulk senders to publish a DMARC record and say in the same breath that the enforcement policy can be set to none. Publishing it is the requirement; the value is your choice. Second, p=reject is the only value that stops a phishing message pretending to be your invoices team. Quarantine puts it in a folder people still open.
pct, sp, rua and ruf: the tags that shape the policy
The policy tag is rarely published alone. Four other tags decide how much of your mail it covers, what happens to subdomains, and whether you ever hear about any of it.
_dmarc.acme.example. TXT "v=DMARC1; p=quarantine; pct=25; sp=reject; rua=mailto:dmarc@acme.example"pct: apply the policy to a fraction
pct=25 asks receivers to apply the stated policy to a quarter of failing messages and the next-less-strict policy to the rest. At p=quarantine that means a quarter are quarantined and three quarters are treated as none; at p=reject it means a quarter are rejected and the rest quarantined. The default is 100. It is a throttle for your own mistakes, not a security setting, and the record above is what a domain looks like halfway up the ladder.
sp: a separate policy for subdomains
A receiver that finds no record at a subdomain falls back to the organisational domain and reads sp= if it is present, p= if it is not. So p=quarantine with sp=reject means mail from acme.example is quarantined on failure while mail from any subdomain without its own record is rejected. That is a common and sensible shape: the apex is still being cleaned up, but nobody legitimately sends from random.acme.example, so a stricter default there costs nothing.
rua and ruf: where the reports go
rua is the address aggregate reports are mailed to. ruf is the address for failure reports, sometimes called forensic reports: a copy of an individual failing message, or its headers. Most large receivers do not send failure reports at all, for privacy reasons, so publish ruf if you want the few that arrive but do not build a process on them. Aggregate reports are the ones every serious receiver sends, and they are the ones this post is about.
One catch: if the rua address is on a different domain from the one publishing the record, RFC 7489 section 7.1 requires the receiving domain to publish a small authorisation record, or reports are dropped. Report-parsing services handle that for you and will tell you the record to add.
Two tags this post leaves at their defaults: adkim and aspf, which switch alignment from relaxed to strict. Relaxed lets a subdomain align with its parent, which is the shape nearly every sender has once the return path is on a subdomain. Strict is for a domain that wants exactly one sending identity and knows it has one.
Reading aggregate reports
An aggregate report is a gzipped XML file, one per receiver per day, listing every source IP address that sent mail with your domain in the From header, how many messages it sent, and what the receiver decided. The XML is not friendly, but the shape is small enough to read once and understand forever.
<record> <row> <source_ip>192.0.2.10</source_ip> <count>142</count> <policy_evaluated> <disposition>none</disposition> <dkim>pass</dkim> <spf>fail</spf> </policy_evaluated> </row> <identifiers> <header_from>acme.example</header_from> </identifiers> <auth_results> <dkim> <domain>acme.example</domain> <selector>rasket</selector> <result>pass</result> </dkim> <spf> <domain>mail.example.net</domain> <result>pass</result> </spf> </auth_results></record>Each <record> is one source. <row> holds the IP, the count and the verdict. <policy_evaluated> is the DMARC view: dkim and spf here are pass or fail after alignment, and disposition is what the receiver did. <auth_results> is the raw view: what SPF and DKIM themselves said, and for which domain.
The record above is the one worth learning to recognise. Raw SPF passed, but for mail.example.net, which does not align with acme.example, so DMARC counts SPF as a fail. DKIM passed for acme.example under the rasket selector, which aligns, so the message passes DMARC on DKIM alone. That is an unaligned pass: authentication worked, alignment did not, and one of the two legs is carrying the whole weight. It is fine today. It becomes a failure the moment that DKIM signature breaks in transit.
- Both aligned: healthy. Either leg can fail and the message still passes.
- One aligned: passes, but fragile. Find out why the other leg does not align and fix it before moving up.
- Neither aligned, but you recognise the source: a legitimate stream that will be quarantined or rejected when you move up. This is what
p=noneis for finding. - Neither aligned, unknown source: spoofing, or a system nobody remembered. Check before you assume.
Expect reports to arrive daily from each receiver that saw your mail, usually within a day or two of the record going live. Failure reports, if any come, arrive rarely and per message. A parsing service turns the daily files into a table by source; if your volume is small, a script that unzips the attachments and prints source_ip, count and the two policy_evaluated results is enough to start.
What a week of reports should show before you move up: every source you recognise with at least one aligned leg on every day it sent, no legitimate source with both legs failing, and a short tail of low-volume unknowns that are either forwarders or spoofing. Volume matters here. A stream that sends once a month has not been seen until it has sent, so an inventory that includes the monthly invoice run is worth more than a long wait.
Moving from none to reject safely
The order below is the one RFC 7489 anticipates and the one that has never cost anyone a legitimate message when followed. Each step converts something you would only read about into something that affects delivery, so the reports gate every step.
- Inventory your streams. Write down everything that sends with your domain in the From header: the application, the support desk, the CRM, the billing system, the newsletter tool, the office mail. Include the ones on subdomains. You will miss some, which is what the next step is for.
- Publish p=none with rua. One record at
_dmarc.your domain, nopct, nosp, aruaaddress you will actually read. Nothing changes for anyone. Wait a week, then compare what the reports show against the inventory. - Fix alignment per stream. For every legitimate source, get at least one leg aligned. For a sending service that means signing with your domain and putting the return path on a subdomain of it; for office mail it usually means an SPF include and a DKIM key the provider issues. Repeat until every known stream shows an aligned pass. Retire the streams nobody could identify.
- Quarantine at pct=25, then 100. Change to
p=quarantine; pct=25. Watch the reports and your support inbox for a week or two. If nothing legitimate appears with a quarantine disposition, raisepctto 50, then remove it. Stay at full quarantine for a few weeks. - Reject. Change to
p=reject. If quarantine ran clean, this changes nothing for legitimate mail and everything for impersonation. Addsp=rejectat the same time if you have not already. - Keep reading. A new vendor, a marketing tool someone signed up for, a migration that drops a DKIM record: each one shows up in the reports first. Reject is a destination for the record and a starting point for the habit.
Do not skip the pct stage
Going straight from none to full quarantine is the mistake behind most “DMARC broke our email” stories. The reports at none tell you what fails; they cannot tell you what you have not found yet. A quarter of failing mail in the spam folder is a signal you will hear about. All of it is an outage.
Alignment failures to expect
Once the obvious streams are fixed, the failures that remain fall into four groups. RFC 7960 catalogues them in detail; this is the version you need to recognise them in a report.
Forwarding
A recipient who auto-forwards your message to another account breaks SPF, because the forwarding server is not in your record. DKIM survives, as long as the forwarder does not alter the message. In reports this shows as an aligned DKIM pass and an SPF fail from an IP address you do not recognise, at low volume. It is normal and needs no fix, which is the strongest argument for making sure DKIM aligns everywhere.
Mailing lists
Lists are worse than forwarders: they typically add a subject tag or a footer, which breaks the DKIM signature, and they relay it from their own envelope, which breaks SPF. Both legs fail and a p=reject domain’s posts get bounced to list members. Modern list software rewrites the From header to its own domain when it sees a strict policy, and receivers that implement ARC can trust the list’s attestation of the original result. If your staff post to lists from the corporate domain, expect this and consider a subdomain for them.
Third-party senders
The support desk, the CRM, the survey tool: anything that sends with your address in the From header but has not been configured to sign with your domain. In reports these are the raw passes for somebody else’s domain that do not align, exactly like the record earlier. Most services offer a way to sign with your domain and to put the return path on your subdomain; find that page in each one’s settings and do it. Rasket does both by default: every sending domain is signed under the rasket selector on that domain, and its return path is a subdomain of it, so SPF and DKIM can both align. The return-path post explains the SPF half and the domains page shows the records.
Subdomains and sp
Under relaxed alignment, the default, send.acme.example aligns with acme.example, so a return path or a DKIM domain on a subdomain is fine. The trap is the other direction: a subdomain that sends mail and has no DMARC record of its own inherits the parent’s sp, and if you set sp=reject before that subdomain aligns, its mail is refused while the apex is still at none. Search the reports by header_from for every subdomain before you publish sp.
Frequently asked questions
Is p=none enough to meet Google's bulk sender requirement?
Yes. Google's sender guidelines require bulk senders to publish a DMARC record for the sending domain and state that the enforcement policy can be set to none. The record has to exist and the mail has to align on SPF or DKIM; the policy value is left to you. Treat none as the starting point rather than the destination, because it does nothing to stop impersonation.
How long should I stay at each step?
Long enough for every legitimate stream to have sent at least once, which is usually a few weeks at none and a few weeks at full quarantine. The monthly invoice run and the quarterly statement are the streams people miss, so an inventory that names them is worth more than a longer wait. Move up when the reports show no legitimate source failing, not when the calendar says so.
What does pct do at p=reject?
It applies reject to the stated fraction of failing messages and quarantine to the rest, because the fallback is always the next-less-strict policy. At p=quarantine the fallback is none. pct is a throttle for your own rollout, not a security control: at pct=25 three quarters of spoofed mail is still let through under the weaker policy.
Do I need a ruf address for failure reports?
Not really. Failure reports carry copies of individual failing messages, and most large receivers do not send them for privacy reasons, so publishing ruf brings a trickle at best. Aggregate reports sent to the rua address are what every serious receiver produces and what the rollout depends on. Publish ruf if you want the occasional sample, but never build a process on it.
What policy should a domain that sends no mail publish?
p=reject, straight away, with sp=reject and a rua address. There is no legitimate stream to protect, so there is nothing to lose and a parked domain is a favourite target for impersonation precisely because nobody is watching it. Pair it with an SPF record of v=spf1 -all so both mechanisms say the same thing.
Will p=reject break forwarded mail?
Usually not, provided DKIM aligns. Forwarding breaks SPF, because the forwarding server is not in your record, but a DKIM signature travels with the message and survives any forwarder that does not modify it. Mailing lists are the exception, since they often change the subject or body and break the signature; modern list software rewrites the From header when it sees a strict policy.
Sources
- RFC 7489: Domain-based Message Authentication, Reporting, and Conformance (DMARC) — IETF, read 2026-09-16
- RFC 7960: Interoperability Issues between DMARC and Indirect Email Flows — IETF, read 2026-09-16
- Email sender guidelines — Google, read 2026-09-16
- DMARC overview — dmarc.org, read 2026-09-16
Related
- DMARC — DMARC tells receiving servers what to do with mail that claims to be from your domain but fails DKIM and SPF. You publish one TXT record naming a policy,…
- DMARC alignment — Alignment is the part of DMARC that asks whether the domain that passed authentication is the same one the reader sees. A DKIM signature or an SPF check can…
- DKIM, SPF and DMARC explained for developers — What SPF, DKIM and DMARC each prove, the records to publish, how alignment ties them together, and what the large mailbox providers now require of senders.
- Custom return path: why your bounces need it — What the return path is, how it differs from the From header, why putting it on your own subdomain makes SPF align under DMARC, and the two records that do it.
- Domains — Add a domain, publish the generated record set and send from it. A 2048-bit DKIM key per domain, a custom return path, and verification that runs on its own.