Guide

DMARC p=none vs quarantine vs reject. Which Policy Should You Run?

The p= tag is a staircase, not a preference. What none, quarantine, and reject each do — and the safe migration path that gets you to reject without bouncing your own mail.

9 min read·Updated Jun 22, 2026
TL;DR
The choice of DMARC p=none vs quarantine vs reject is not a preference, it is a staircase. p=none monitors and delivers everything; p=quarantine sends failing mail to spam; p=reject bounces it outright. Start at none to map your sending sources, fix alignment, then ramp through quarantine to reject — the only policy that actually stops spoofing. Below is a decision table and exactly what to verify before each step up.

What the p= tag actually does

A DMARC record is one TXT entry at _dmarc.yourdomain.com. The single most important field is p=, the policy. It tells receiving mail servers what to do with a message that claims to be from your domain but fails DMARC — meaning it is neither SPF-aligned nor DKIM-aligned to the domain in the visible From: header.

dig +short txt _dmarc.example.com
"v=DMARC1; p=none; rua=mailto:dmarc@example.com; fo=1"

The policy has exactly three legal values, and they map to escalating consequences for mail that fails. Picking one without understanding the others is how senders either leave the door wide open (none forever) or bounce their own invoices (reject too soon).

p=none vs quarantine vs reject, side by side

PolicyWhat happens to failing mailStops spoofing?Use it when
p=noneDelivered normally; you just get reportsNoYou are still discovering which servers send as you
p=quarantineDelivered to the spam / junk folderMostly — recipients can still retrieve itReports are clean and you want a soft landing
p=rejectBounced at SMTP; never deliveredYes — the goal stateEvery legitimate stream is confirmed aligned

Why everyone starts at p=none

p=none is monitor-only. Failing mail is still delivered, but receivers send you aggregate (RUA) reports listing every IP that sent mail claiming to be your domain, and whether each passed SPF, DKIM, and alignment. This is the discovery phase, and you cannot skip it. Most organizations are genuinely surprised by what shows up: a forgotten marketing tool, the helpdesk, the billing system, a contractor's server.

_dmarc.example.com.  TXT  "v=DMARC1; p=none; rua=mailto:dmarc@example.com; fo=1"

The rua address is where the daily XML reports land (point it at a parser, not a human inbox). fo=1 asks for a failure report whenever any authentication mechanism fails, which speeds up debugging. Stay here until the reports show every legitimate source aligned — and not a day longer, because none protects nobody.

Stepping up to p=quarantine

quarantine is the soft landing. Mail that fails DMARC is delivered to the spam folder rather than the inbox. The reason to stop here on the way up, rather than jumping straight to reject, is forgiveness: if you missed a legitimate stream in the reports, your customers' mail lands in spam and someone notices and complains — recoverable. Under reject that same mail bounces silently and you lose it.

_dmarc.example.com.  TXT  "v=DMARC1; p=quarantine; pct=25; rua=mailto:dmarc@example.com"

Note the pct=25: apply the quarantine policy to a random quarter of failing mail and treat the rest as none. Watch the reports for a week, raise to pct=50, then pct=100. It is a volume dial for risk.

Reaching p=reject, the only policy that stops spoofing

p=reject is the destination. Failing mail is refused at the SMTP layer and never reaches the recipient. This is what actually stops someone from sending phishing mail with your domain in the From line — every DMARC-honoring receiver (effectively all of Gmail, Outlook, Yahoo) will turn it away. It is also the bar you must clear before BIMI will show your logo in the inbox.

_dmarc.example.com.  TXT  "v=DMARC1; p=reject; sp=reject; rua=mailto:dmarc@example.com; adkim=s; aspf=s"

Here sp=reject extends the policy to subdomains you never send from (a favorite spoofer trick), and adkim=s; aspf=s tighten alignment from relaxed to strict once you are confident every stream signs with an exact-match domain.

The safe migration path: verify before each step

The whole ramp is gated on one question: can I see all my legitimate mail in the reports, and is it aligned? Before each step up, confirm:

  1. Before none → quarantine: every legitimate sending source appears in your aggregate reports, and each one passes SPF alignment, DKIM alignment, or both. Zero surprises for two to four weeks.
  2. Before raising pct: no new failing-but-legitimate sources have appeared since the last bump, and your spam-folder complaints have not risen.
  3. Before quarantine → reject: you have run pct=100; p=quarantine for at least a week with clean reports. Nothing legitimate is landing in spam.
  4. After reject: watch reports for another week. A stream that breaks now bounces, so this is the window to catch a forgotten quarterly mailer or an annual renewal notice.
Watch out
Never edit the policy and the alignment config in the same change. If you tighten aspf=s and bump to p=reject together and mail starts bouncing, you will not know which change did it. Move one variable at a time, and give reports a few days to catch up between moves.

Monitoring through the ramp, and after

DMARC is not a set-and-forget record. The policy that was safe at reject last quarter breaks the moment someone adds a new mail tool without aligning it, rotates a DKIM key and forgets the new selector, or lets an SPF include drift. Because reject bounces rather than warns, you find out from lost mail, not a heads-up.

DomainsDoc reads your DMARC record continuously — the policy value, the alignment mode, the reporting tags, and whether the record still parses after a registrar migration clobbers it — and alerts you the moment your policy weakens or your alignment slips. Add your domain to see your current policy and where it sits on the staircase, and check pricing for continuous monitoring as you ramp.

Frequently asked questions

Is p=none good enough to be "DMARC compliant"?
For the letter of most requirements (including the Gmail and Yahoo bulk sender rules) a published record with p=none plus passing alignment is enough. But p=none does nothing to stop spoofing — it only tells receivers to deliver everything and send you reports. It is the starting line, not the finish. Anyone publishing p=none long-term is monitoring a problem they have chosen not to fix.
How long should I stay at p=none before moving to quarantine?
Long enough to see a full business cycle in your aggregate reports — usually two to four weeks. You are waiting until every legitimate sending source (your ESP, your CRM, your helpdesk, your invoicing tool) shows up in the reports with DMARC aligned. The clock is driven by how many mail streams you have, not by the calendar. Move on once the reports are boring.
What is the difference between p=quarantine and p=reject in practice?
With p=quarantine, mail that fails DMARC is delivered to the spam/junk folder — the recipient can still find it. With p=reject, failing mail is bounced at the SMTP layer and never arrives at all. Quarantine is the soft landing: a misconfigured stream lands in spam and someone complains, instead of silently bouncing. Reject is the real protection, because spoofed mail simply never reaches the inbox.
Will moving to p=reject block my legitimate mail?
Only mail that fails DMARC, which means mail that is neither SPF-aligned nor DKIM-aligned to your From domain. If you have watched aggregate reports through p=none and p=quarantine and every legitimate source is aligned, the answer is no. The danger is moving up before you can see your streams — that is exactly what the staged ramp and the pct dial exist to prevent.
What do the pct and sp tags do?
pct=25 applies your policy to a random 25% of failing mail and treats the rest as p=none — a way to dip a toe into quarantine or reject without betting your whole mail flow. sp= sets the policy for subdomains independently of the main domain; without it, subdomains inherit the parent policy. Use sp=reject to stop spoofers from inventing subdomains you never send from.
Does p=reject stop all spoofing of my domain?
It stops "exact-domain" spoofing — mail with your domain in the visible From — at every receiver that honors DMARC, which is now the overwhelming majority. It does not stop look-alike domains (exarnple.com), display-name spoofing, or compromised accounts that send genuinely authenticated mail. DMARC at reject closes the biggest hole; it is not the whole wall.
Try it now
DMARC Record Analyzer

Read your current policy, alignment, and reporting tags in seconds — before you change a thing.

Open tool
Stop reading. Start monitoring.

Continuous SPF, DKIM, DMARC, blacklist, SSL, and uptime checks. Alerts the moment something breaks.

Start free
Keep reading