Blog · Dmarc
How to Move from DMARC p=none to p=reject Without Breaking Email
You inherited a domain with v=DMARC1; p=none; in the DNS. The security team wants enforcement. You have 100,000 unread XML reports and no clear picture of who is actually authorized to send email on your domain's behalf. This post is the workflow for that exact situation.
The short version: don't flip the switch until you've worked through the reports, audited your SPF, and built a monitoring habit. Here's how to do it properly.
Why p=none Exists - and Why It Becomes a Problem
p=none is monitoring mode. It tells receivers to do nothing with email that fails DMARC - it just sends you aggregate reports. This is useful when you're setting up email authentication, but it offers zero protection against spoofing. Anyone can send email that appears to come from your domain, and receivers will accept it.
When your organization is ready to enforce - either because of a security audit, a spoofing incident, or compliance requirements - you need a path from p=none to p=reject that doesn't accidentally break legitimate vendor mail.
The Three-Phase Model
Most organizations move through three DMARC policy stages:
Phase 1 - p=none (monitoring) You collect RUA and RUF reports. You learn what mail is passing and failing, and which third-party services send on your behalf.
Phase 2 - p=quarantine (testing) Failing email gets routed to spam or quarantine instead of rejected outright. This is your safety net - legitimate mail that fails DMARC still arrives, but you start seeing which failures are real problems.
Phase 3 - p=reject (enforcement) Receiving mail servers reject email that doesn't pass DMARC. This is the goal, but you should only reach it after you've audited your authorized senders and set up monitoring.
Skipping phases doesn't save time. Jumping straight to p=reject when you don't know your senders is how organizations accidentally block their marketing platform, their payroll system, or their CRM for days before anyone notices.
Step 1: Triage Your Backlogged Reports
If you have 100,000+ unread XML DMARC reports, start by getting organized. XML files are not human-readable in bulk - this is the first practical barrier most admins hit, and it's why many stay at p=none longer than necessary. A DMARC report parsing tool is the practical first investment.
What you're looking for in the reports:
Sources that are clearly authorized - your own mail servers, your ESP's sending IPs, your Microsoft 365 or Google Workspace infrastructure. You'll see these in the source field of each in the aggregate report.
Sources that might be authorized - third-party services you've heard of: CRMs, support platforms, HR tools. The header_from domain tells you which domain was used in the From: header. The source field tells you where the mail actually came from.
Sources that are definitely not authorized - anything sending from your domain that you can't identify. These might be forwarding services, compromised accounts, or old systems that should have been decommissioned.
If you have RUF forensic reports (they require a separate mailto: target), they show individual message-level failures. These are useful for identifying exactly which messages failed and why - but they generate significant volume. RUA aggregate reports are usually the right starting point for the backlog audit.
Step 2: Find Your Mystery Senders
The hardest part of the transition isn't the DNS records. It's the services sending mail from your domain that you've forgotten about.
Common sources that appear in reports but aren't always documented:
- Marketing email platforms (Mailchimp, HubSpot, SendGrid sending on your behalf)
- Internal tools with SMTP relays
- Legacy systems that send password resets or notifications
- HR platforms, payroll systems, benefits portals
- Cloud services with email notification features
- Print-to-email services, scanned document delivery tools
When you find a source you don't recognize, the question isn't just "what is this?" - it's "should this be DKIM-aligned or SPF-authorized?" Because for a message to pass DMARC, it needs either:
- SPF alignment: the domain in the From: header matches the domain that authorized the sending server via SPF, OR
- DKIM alignment: the domain in the From: header matches the domain in the DKIM signature
If a service sends from your domain but doesn't sign with DKIM and isn't in your SPF record, it will fail DMARC once you hit p=reject. This is the most common cause of legitimate mail getting blocked after a policy flip.
Step 3: Audit Your SPF Record
Before moving to p=quarantine, confirm your SPF record covers everything it should. Common gaps:
Old vendor includes that should be removed - if a service was discontinued or migrated, its SPF include may still be there, causing softfail on messages that appear to come from that vendor.
Overly broad includes - include:spf.example.com where that domain itself includes dozens of other domains creates lookup chain complexity and may exceed the 10-lookup SPF limit (RFC 7208).
Missing includes - new services added after the last SPF audit.
Run dig TXT yourdomain.com and look at what's there. If you haven't audited it in more than a year, assume it's out of date.
Step 4: Pre-Flight Checklists Before Each Phase
Before moving from p=none to p=quarantine:
- [ ] You've reviewed at least 30 days of RUA aggregate reports
- [ ] All identified authorized senders are either in your SPF record or signing with DKIM
- [ ] You have a process for adding new third-party senders as they appear
- [ ] You can explain every
failresult in your recent reports - [ ] A test mailbox shows that quarantine delivers to spam, not silently drops
Before moving from p=quarantine to p=reject:
- [ ] You've run
p=quarantinefor at least 2-4 weeks without unexpected blocks - [ ] You've contacted any vendors on your whitelist to confirm their DKIM signing is active
- [ ] You have monitoring set up to alert you when new senders appear in reports
- [ ] Your IT team knows how to respond if a vendor reports delivery failures
- [ ] You have a rollback plan (switch back to
p=quarantinewithin minutes if problems appear)
Step 5: Set Up Ongoing Monitoring
Moving to p=reject doesn't mean the work is done. New senders appear. Vendors change their infrastructure. Teams add new tools without telling the email team. If you don't monitor, you'll only find out about problems when users report missing email - which may not happen for days.
What good DMARC monitoring looks like:
- Daily or weekly summary of pass/fail rates per source
- Alerting when a new source starts sending from your domain
- Alerting when your overall authentication pass rate drops significantly
- Visibility into both RUA aggregate data and RUF forensic failures
This is where parsing XML manually becomes a genuine bottleneck. For teams managing multiple domains or high email volume, automated parsing isn't convenience - it's what makes monitoring realistic. DMARCFlow processes aggregate reports automatically, flags new senders as they appear, and sends actionable alerts before a vendor problem becomes a business disruption. That's the practical tool for this specific step.
Step 6: Handle Services That Can't Be Fixed
Some services will never support DKIM signing or proper SPF alignment for your domain. Common examples:
Legacy notification systems - old internal tools that send from a shared SMTP relay but can't be updated.
Forwarding-only accounts - email sent from your domain by a user who has moved to a different platform, where replies still route through your servers.
For these cases, you have several options:
Subdomain isolation - move these services to a subdomain (like notifications.example.com) with its own DMARC record set to p=none or p=quarantine. This keeps your main domain (example.com) fully enforced while allowing legacy services to continue operating.
Whitelisting via mail flow rules - in Microsoft Exchange Online or other mail gateways, you can create transport rules that accept mail from specific IPs without triggering blocking. This is a workaround, not a long-term solution, but it buys time while you migrate off legacy systems.
Contact the vendor - if a service you pay for is failing DMARC, open a support ticket. Some vendors have DKIM setup guides specifically for this.
FAQ
Does moving to p=reject block all email that fails DMARC? Yes, essentially. Receivers that respect DMARC will reject mail that doesn't pass either SPF or DKIM alignment. This is intentional - that's the point of enforcement. The risk is that legitimate mail from services you forgot to account for also gets rejected.
What happens to email forwarded from third-party services? Forwarded mail often breaks SPF because the forwarder's server becomes the new sending server, and it isn't in your SPF record. DKIM signatures can survive forwarding if the forwarding process doesn't modify the message body, but this is unreliable. ARC (Authenticated Received Chain) was designed to help with this, but ARC support is not universal and the protocol is being phased out.
Can I move directly from p=none to p=reject? Technically yes, by changing the DNS record. Practically, no - unless you are certain you have identified every legitimate sender, this is how you break email for entire categories of vendors without warning. The phased approach exists because the discovery process takes time.
My DKIM is solid but SPF has gaps - can I still move to p=reject?
Yes. DMARC requires only one alignment: either SPF or DKIM. If your DKIM signing is reliable across all your authorized senders, you can move to p=reject even with an incomplete SPF record - provided every gap in SPF corresponds to a sender that is already covered by your DKIM. If you're unsure whether a gap matters, treat it as a blocker until you've confirmed DKIM coverage for that source.
How do I know if I've found all my authorized third-party senders? You don't - not with certainty. New services get added, vendors change their infrastructure, and internal teams spin up tools without telling the email admin. This is why ongoing monitoring is not optional. It catches new senders before they become production incidents.
The Practical Path Forward
Moving from p=none to p=reject is straightforward in theory: change the DNS record and wait. In practice, the organizations that do this successfully are the ones that spent time with their reports first.
If you're staring at 100,000 XML files and wondering where to start, the priority order is:
- Get a readable summary of your aggregate reports (parsing XML manually is not the right starting point)
- Identify every source sending mail from your domain
- Classify each as authorized, unknown, or unauthorized
- Fix the authorized-but-misconfigured ones (missing DKIM, missing SPF)
- Move to p=quarantine and watch for 2-4 weeks
- Move to p=reject with monitoring active
The organizations that move to p=reject without a monitoring plan in place tend to find out about problems the same way: a user calls to say they haven't received any email from a key vendor in three days. Automated monitoring and alerting turns that incident into a ticket. That's the operational difference between a smooth enforcement transition and a cascade of emergency rollbacks.