Blog · Dmarc

How to Move DMARC from p=none to p=reject Without Breaking Your Email

Why p=none Is Not Protection

p=none tells receiving mail servers to report on your domain but take no action. It gives you visibility into who is sending mail on your behalf. It does not stop spoofing. Threat actors are not waiting for you to finish your audit.

p=reject is where protection begins. Mail that fails DMARC gets dropped. For most organizations, that is the point of the whole exercise.

The hard part is getting there without breaking your own legitimate mail. Most migration guides say "analyse your reports and fix failures first." That is correct but vague. What they usually skip is how to read those reports systematically, how to know when you have found all the problem sources, and how to catch new senders appearing after you thought the audit was complete.

This is where the migration lives or dies. Parsing aggregate reports by hand means looking at XML, manually matching IPs to vendors, and re-checking every time a new source appears. That work does not stop after you move to reject. It becomes ongoing.

If you are doing this manually, plan for at least two to four hours per month of sustained attention after the migration is complete. Most teams underestimate this. DMARCFlow automates the report parsing, source classification, and new sender alerts, so the ongoing work becomes monitoring a dashboard instead of maintaining a spreadsheet. That shift in operational burden is what makes the difference between teams that stay at p=none indefinitely and teams that move to reject and stay there.

What Aggregate Reports Tell You

Aggregate reports arrive daily from participating receivers. Each report tells you which IPs are sending on your domain, whether they pass or fail SPF and DKIM alignment checks, and approximately how many messages are involved.

The fields worth focusing on:

  • Source IP: the sending IP address
  • SPF result: pass or fail against the envelope-from domain
  • DKIM result: pass or fail against the header-from domain
  • Disposition: none, quarantine, or reject (what the receiver did with the mail)
  • Count: message volume from this source
  • Policy evaluated: the DMARC result after alignment checking was applied

Aggregate reports arrive as XML. Raw XML is not human-readable. DMARCFlow converts these automatically into structured summaries that make it easier to spot patterns across large message volumes. If you are reading XML by hand, you are spending time that is better spent fixing sources.

Classifying Your Sending Sources

Sort every source in your aggregate report into one of four buckets:

Aligned pass: SPF passes, DKIM passes, and both align with your organisational domain. This is the target state.

Aligned partial: Either SPF or DKIM passes individually but the other fails alignment. A subdomain used for envelope-from while your DKIM is signed at the root is the usual cause. Usually fixable.

Misaligned failures: Both SPF and DKIM fail. The source could be a legitimate vendor with a misconfiguration, a forwarding chain, or something you do not recognise.

Unknown source: An IP you cannot match to known infrastructure or a known vendor. High volume from this bucket needs immediate investigation.

The Three Failure Patterns That Break Mail When You Move to reject

Most legitimate mail breaks at p=reject for the same three reasons.

1. Missing SPF on subdomains that send mail

This is the most common cause of unexpected breakage. If newsletters.example.com sends email through a marketing platform but nobody added an SPF record for newsletters.example.com, that subdomain inherits the DMARC policy from example.com. The marketing platform relays mail with envelope-from showing newsletters.example.com. No SPF record exists for it. SPF fails. DKIM may also fail depending on how the platform signs its mail.

The fix: add an SPF record for every subdomain that sends mail. If a subdomain genuinely cannot have its own SPF record, add a local DMARC record with p=none for that subdomain so it does not inherit the organisational reject policy.

2. Third-party security gateways and email relays

Proofpoint, Mimecast, IronScales, and similar products sit between your mail server and the internet. Depending on their configuration, they may rewrite the envelope-from or handle DKIM signatures in ways that break DMARC alignment. This is a documented problem with several major SEG vendors. The fix requires configuring the vendor to use your DKIM key for signing, enabling their SRS (Sender Rewriting Scheme) implementation, or routing that vendor's mail through a subdomain with a local p=none policy.

3. Forwarding chains

Forwarded mail often loses DKIM signatures. The forwarding server becomes the new SPF sender, which means both SPF and DKIM alignment fail for the original domain. This is why forwarding is a persistent DMARC failure cause that is difficult to fully eliminate.

Mitigations include ARC (Authentication Received Chain), which preserves original auth results through forwarding hops, and List-ID headers for mailing lists. Neither is universally supported, and the problem scales with the number of forwarding hops.

Fix Them in Order

Once you have classified your sources, work through them in this sequence:

1. Audit your subdomains. Find every subdomain that sends mail, even occasionally. Add explicit SPF records or set a local p=none policy on subdomains that cannot be fixed immediately. Missing subdomains are the single biggest cause of sudden breakage when you move to reject.

2. Identify third-party relays. Match the sending IPs in your aggregate report to known vendors. Confirm whether each vendor supports DKIM alignment. Escalate misconfigurations with a written deadline. Most reputable vendors fix this within one reporting cycle.

3. Test forwarding scenarios. Forward a message from each forwarding path you support and check the DMARC result. If forwarding failures are material, consider an ARC-aware gateway or move those workflows to a subdomain with a local policy.

4. Set pct before moving to reject. Add pct=50 to your DMARC record before changing the policy to reject. This causes 50% of failing mail to be rejected while the rest follows your aggregate reporting. Monitor for 48 hours. If nothing legitimate breaks, increase to pct=75, then to pct=100 in stages. This is how you catch problems before they affect your entire mail flow.

During this phase, your aggregate reports become your real-time feedback loop. DMARCFlow monitors pct changes and alerts you to spikes in rejection rates from sources you had classified during the audit, so you catch regressions before they become incidents. Without that monitoring layer, the pct phase requires checking reports manually every few hours - which most teams do for the first day, then stop.

5. Watch for new sources appearing. A new marketing platform, a recently provisioned SaaS tool, or an acquisition can introduce new sending sources that were not in your initial audit. Stay at p=none until you have gone through at least one full business cycle without discovering a new source.

How Long Should You Stay at p=none?

The common answer is 30 days with no new failures. That is a reasonable floor, but the real trigger is whether your sending landscape is stable and fully characterised.

If you launched a new product recently, switched marketing platforms, or onboarded a new vendor, new sending sources will appear in your aggregate reports. Wait until those sources have been evaluated and either fixed or explicitly accepted before moving to reject.

A useful rule: stay at p=none until you have received at least two consecutive monthly aggregate reports with no new sending sources appearing. New sources mean incomplete data. Incomplete data means you are guessing.

Flipping the Switch: What to Watch in the First 24 Hours

Before you change the policy to p=reject, configure alerts so you see rejection rate spikes immediately.

In the first 24 hours after moving to p=reject, check your aggregate reports every few hours. Legitimate mail that breaks will show as SPF and DKIM failures from sources you had classified during the monitor phase. If you see an unexpected spike in rejections from a source you thought was aligned, something in that sending path has changed.

If problems appear, revert to p=quarantine immediately or reduce pct back to the last safe level. Rolling back takes seconds. Explaining to your CEO why customer onboarding emails stopped arriving takes considerably longer.

FAQ

Can I move straight to p=reject without going through p=none first?

Technically yes. The DMARC specification does not require a monitor phase. In practice, skipping p=none means you have no visibility into what is actually sending on your domain. If a business unit started using a new email tool last quarter without telling IT, you will not know it until their mail starts bouncing. This is the most common cause of post-migration incidents.

What if a vendor refuses to fix their DMARC alignment?

Give them a written deadline and escalate through your vendor management team. If they cannot or will not fix the alignment within a reasonable timeframe, route their mail through a subdomain you control with its own SPF and DKIM configuration, or remove their ability to send from your primary domain until the issue is resolved.

What if I use marketing automation that sends from my domain?

Marketing automation platforms need to DKIM-sign mail at your domain or send from a subdomain with explicit SPF and a local DMARC policy. If your current platform does not support DKIM signing at your domain, open a support ticket. If they do not offer it as a feature, treat it as a vendor risk finding.

What if mail breaks immediately after moving to reject?

Revert to p=none, set pct=50, and run another audit cycle. You found something your initial analysis missed. That is normal. It is why the pct mechanism exists.

Does DMARCFlow help here?

Yes. DMARCFlow parses aggregate reports automatically, flags new sending sources as they appear, monitors subdomain SPF coverage so you catch missing records before they cause rejections, and alerts you when moving to p=reject would affect an unclassified source. The work described in every section of this article - the report parsing, the source classification, the ongoing monitoring for new senders - is the work that DMARCFlow automates. That is not a feature list. It is the actual operational burden that makes this migration safe.

Moving to reject Is Not a One-Time Setting

Once you move to p=reject, you are not done with DMARC. New sending sources will continue to appear. Vendors will change their infrastructure. Business units will adopt new tools without notifying IT. Your aggregate reports remain your primary signal for catching these changes before they become incidents.

The organisations that run DMARC successfully long-term treat p=reject as the beginning of an ongoing monitoring process, not the end of a project. The audit work you did before the migration is the same work that keeps you safe after it. That ongoing work is exactly what DMARCFlow was built to handle automatically.