Blog · Dmarc
How to Move Your DMARC Policy from p=none to p=reject Without Breaking Email
How to Move Your DMARC Policy from p=none to p=reject Without Breaking Email
Every domain that starts with DMARC begins at the same place: p=none. The none policy tells receiving mail servers to monitor but not act on authentication results. It is the correct starting point. It is not the correct ending point.
The goal of any DMARC implementation is p=reject. When your policy is reject, unauthorized senders cannot deliver mail impersonating your domain. Phishing stops. Spoofing stops. But jumping from p=none to p=reject without preparation is one of the most reliable ways to break your own legitimate email delivery.
This guide covers how to make that transition safely.
Why p=none to p=reject Breaks Email
The reason this migration fails is almost always the same: something was sending email on behalf of your domain that you did not know about, or something was sending email that you thought was properly authenticated but was not.
The most common causes:
Third-party senders without DKIM alignment. Marketing platforms, CRM tools, support software, and billing systems often send email with your domain in the From address but sign with their own DKIM key. At p=none, receivers accept this. At p=reject, those messages are dropped because neither SPF nor DKIM is aligned with your domain.
Legacy forwarding chains. Some forwarding services rewrite the From address or strip DKIM signatures. If your email flows through a forwarder that modifies headers, DMARC alignment fails even if the original sending infrastructure was correct.
Misconfigured SPF records. If your SPF record includes IP addresses that no longer send for your domain, or if it was set up with a third-party service that has since changed, the SPF check may pass but alignment may still fail at the DMARC layer.
Internal relay servers. Some organizations have internal mail servers that forward mail externally. These relays may not DKIM sign and may not have aligned SPF, causing reject-policy failures on internal-to-external flows.
Prerequisites Before Moving to p=reject
Before you change your policy, you need to confirm three things.
You have been monitoring for at least 30 days. DMARC aggregate reports show patterns over time. One or two days of data is not enough to see weekly senders, scheduled batch jobs, or seasonal campaigns. Aim for a full 30-day cycle minimum.
Your DKIM and SPF failure rates are under 1%. Review your DMARC reports and look for the percentage of messages failing DKIM alignment or SPF alignment. If you are above 1%, find the source of those failures before proceeding. Common causes: senders using your domain without proper DKIM, forwarding, or incorrect SPF includes.
You have identified and mapped every legitimate sender using your domain. This means every marketing platform, every SaaS tool, every internal system, every shared infrastructure, and every third-party service that sends as you. If you do not know about it, you cannot fix it. If you cannot fix it, you cannot safely move to reject.
How to Make the Transition: Step by Step
Step 1: Fix known failures first. Before touching your policy record, resolve every DKIM alignment failure and SPF alignment failure you can identify. Use your aggregate reports to find the sending sources that are failing. Either authenticate them properly or exclude them from your policy domain.
Step 2: Set p=quarantine as your interim policy. Change your DMARC record from p=none to p=quarantine. This tells receivers to treat unauthenticated mail as suspicious but not to block it outright. This is your rehearsal period. Monitor for two weeks at quarantine before moving to reject. If you see a spike in delivery issues at quarantine, you will see a worse spike at reject.
Step 3: Monitor aggregate reports daily during the quarantine period. Look for new sources that were not visible in your initial monitoring. Some senders are intermittent. If you see a new failure source at quarantine, fix it before moving to reject.
Step 4: Move to p=reject in a quiet period. Choose a time when you are not running large campaigns, not doing infrastructure changes, and not expecting critical external communications. A Friday afternoon is often cited by practitioners as a good starting point because you can monitor over the weekend.
Step 5: Watch for 48 hours after moving to reject. Check your mail logs, watch for delivery complaints, and monitor your outbound mail flow. If something breaks, you can move back to p=quarantine immediately while you investigate.
Common Failure Modes After Moving to p=reject
Forwarders. If a recipient uses a mailing list or email forwarder that modifies messages, DMARC alignment breaks. Mailing lists that forward without remailing are the most common culprit. Solution: check whether the forwarding service offers authenticated forwarding or subdomain-based sending.
Subdomain sending. If a third-party service sends from a subdomain you control but does not DKIM sign with the root domain, DMARC alignment fails. Some services use their own subdomain in the DKIM signature (e.g., send from your domain but DKIM sign with their domain). This fails alignment. Solution: configure DKIM signing for your domain at the selector level, or use a sending subdomain that is explicitly authorized.
SaaS tools that send as you. Some SaaS tools claim to support DMARC but only sign with their own DKIM key and use their own SPF record, not yours. At p=none this works because the receiver sees no policy. At p=reject it fails. Solution: check with each vendor whether they support custom DKIM domain signing and aligned SPF.
How to Recover if p=reject Breaks Something
If legitimate email stops arriving after moving to p=reject, the first step is to move back to p=quarantine immediately. Do not wait to see if it resolves. Your domain is now actively blocking mail and every hour matters.
Once you are back at quarantine, review your DMARC reports for the reject period. The reports will show which receivers are rejecting mail, which domains are failing, and which failure mode (SPF alignment, DKIM alignment, or both) is responsible.
Identify the source, fix it, then try again.
The Operational Problem That Keeps Domains at p=none
There is a specific reason most domains never move past p=none, and it is not technical ignorance. It is operational: aggregate report monitoring is time-consuming to do manually, and most teams do not have a reliable way to receive, parse, and act on DMARC reports continuously.
You cannot safely move to p=reject if you do not know what is failing. But receiving and making sense of DMARC reports is non-trivial: they arrive in XML format from dozens of receivers, they are voluminous, and the data is structured for machines not humans. If your DMARC monitoring consists of occasional manual DNS lookups or relying on customer complaints to tell you something is wrong, you are already behind before you start.
This is the problem DMARCFlow solves. It connects to your DMARC reporting address, parses incoming XML reports from all receivers, and turns them into a structured view of your authentication health: which sources are failing, which domains are rejecting your mail, and which new senders have appeared since your last check. When a new failure source shows up at p=quarantine, you know before it becomes a reject-period crisis.
For the p=none to p=reject migration specifically, DMARCFlow makes the quarantine rehearsal phase practical rather than theoretical. Instead of hoping you notice problems in reports, you get structured alerts when something new fails.
What a Correct p=reject Record Looks Like
A minimal DMARC record at p=reject looks like this:
v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com; pct=100;
A more complete record that includes SPF alignment reporting:
v=DMARC1; p=reject; sp=reject; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-forensic@example.com; fo=1; pct=100;
Key components:
v=DMARC1-- required version tagp=reject-- your policysp=reject-- subdomain policy (set to reject for subdomains too, unless you send from subdomains differently)rua-- aggregate report destination (where you receive per-day rollups)ruf-- forensic report destination (per-incident failure reports, use sparingly)fo=1-- request forensic reports for any failure mode (0 for only DKIM failures, 1 for any failure)pct=100-- apply to 100% of messages (do not lower this unless you are intentionally phasing in)
The 30-Day Checklist Before Moving to p=reject
Use this checklist before making the switch:
- At least 30 days of p=none aggregate reports reviewed
- DKIM failure rate under 1%
- SPF failure rate under 1%
- All known third-party senders identified and DKIM-aligned or excluded
- No unknown failure sources appearing in the last two weeks of reports
- Internal relay infrastructure checked for alignment
- Forwarding paths reviewed for any that strip DKIM or modify headers
- Emergency rollback plan in place (p=quarantine ready to deploy)
- Monitoring team aware and able to respond to delivery complaints
- DMARC aggregate reports being received and reviewed regularly
Summary
Moving from p=none to p=reject is the most important step in your DMARC maturity journey. It is also the step where the most things can go wrong. The key to doing it safely is preparation: know every sender, fix every failure source, spend time at quarantine before moving to reject, and monitor your reports continuously after the switch.
The domains that do this well spend weeks or months at p=quarantine. The domains that break things rush the transition. Take the time to do it right.