Blog · Dmarc

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

The most common mistake organizations make when tightening their DMARC policy is treating the DNS record change as the starting point. It is the finishing point. The hard work - the sending source audit - comes first, and skipping it is how legitimate email gets blocked.

This guide covers the full safe migration path from p=none to p=reject. It is written for organizations that already have DMARC running in monitoring mode and are ready to actually enforce it, but do not have expensive email authentication tooling.

Why p=none Is Not a Safe Starting Point

p=none tells receiving mail servers to do nothing when an email fails DMARC alignment. No block. No quarantine. No signal at all. It is useful for collecting baseline data, but it provides exactly zero protection against spoofing.

Attackers know this. The moment a domain publishes a DMARC record at all, it shows up in DNS logs. Domains at p=none are effectively waving a flag that says "we care enough about email authentication to publish a record, but not enough to actually enforce it." That is a useful signal for someone running a spoofing campaign.

The real cost of staying at p=none is time. Most organizations that get breached via email spoofing had DMARC published. They had p=none. The breach happened anyway, and the post-incident fix is always the same: move to p=reject under pressure, without the audit that would have made the move safe.

The situation that triggers this conversation most often is the "no tools, no experience" scenario: IT stakeholders who have been told to "just set DMARC to reject" without any of the infrastructure to make that safe. That scenario - the one where the stakeholders themselves do not know what sends mail from their domain - is exactly why the audit step exists.

What You Need Before You Change One Character in DNS

Before the DNS record changes, three preconditions must be met.

SPF must be aligned. Every IP address that sends authenticated mail from your domain must appear in your SPF record. If a server is sending mail as your domain and its IP is not in SPF, that mail will fail DMARC regardless of your policy setting.

DKIM must be aligned. Every message signed with DKIM must use a signing domain that matches your organizational domain. If a third-party tool signs mail with its own domain instead of yours, that signature does not contribute to DMARC alignment.

You must know every legitimate source that sends mail from your domain. This is the precondition that gets skipped most often, and it is the one that causes outages. If you do not know what sends mail from your domain, you are not ready for p=reject.

These three things are not optional. You cannot compensate for missing one by being more aggressive on another.

The Sending Source Audit - What Most Guides Skip

A sending source audit means collecting your DMARC aggregate reports for at least 30 days and reading every unique source that appears in them. Here is how to do it without expensive tooling.

Step 1: Get your aggregate reports. If you are at p=none, your receiving domain is generating XML aggregate reports and sending them to the RUA address in your DMARC record. If you have not configured an RUA address, set one up now before anything else. Use a dedicated address for these reports - they are machine-readable XML and not meant for human inboxes.

Step 2: Extract every unique IP address. Look at the `` elements in the aggregate report XML. Every unique IP that appears is a sending source for your domain. Cross-reference each one against your known infrastructure: your mail gateway, your SaaS tools, your internal mail servers.

Step 3: Identify unknown sources. This is where most audits find surprises. Common categories:

  • Microsoft 365 sending for shared mailboxes or distribution groups
  • Salesforce, HubSpot, or other CRM platforms sending on your behalf
  • Transactional email providers (SendGrid, Mailgun, Amazon SES)
  • Marketing automation platforms
  • Internal relay or gateway servers set up by previous IT teams

If an IP is not yours and you do not recognize the service, that source needs SPF coverage or DKIM signing before you change your policy. Adding an unknown source to SPF after setting p=reject means the first several hours of mail to that destination will bounce while receivers update their caches.

How to Read DMARC Aggregate Reports Without Expensive Tools

Aggregate reports arrive as gzipped XML. The structure is verbose but not complex. Each `` in the report represents a message flow. The key fields:

`` - the IP address of the sending mail server. This tells you who is sending.

`` - shows "pass" or "fail" for each DKIM signature. If you see fail, check whether the signing domain matches your organizational domain.

`` - shows "pass" or "fail" for SPF. A fail here usually means the sending IP is not in your SPF record.

`` - the disposition: "none", "quarantine", or "reject." This tells you what the receiving server would do with the message under your current policy. If you see "none" here but "fail" in `` or ``, that means the message passed DMARC alignment despite the individual auth failure.

Reading raw XML is tedious. That is the practical gap DMARCFlow fills - it parses these reports automatically, groups sending sources, tracks failure rates over time, and flags new IPs the moment they appear. For a team doing this migration without dedicated email auth tooling, processing raw reports manually is the biggest friction point.

What Happens When You Set p=reject (And Why It Is Safe)

p=reject means: when a receiving mail server evaluates an incoming message and finds it fails DMARC alignment, the server rejects the message at the SMTP level. The sending MTA gets a 550 5.7.1 rejection and the message never reaches the recipient's inbox.

Your legitimate mail is not affected by this. If your sending sources are properly covered by SPF and DKIM, and those signatures align with your organizational domain, your mail passes DMARC and is not touched by the policy. The rejection only applies to mail that is not properly authenticated.

The bounce goes to the Return-Path address - the envelope sender, not the From address. This matters because the From address can be forged; the Return-Path is set by the receiving server's MDA during the SMTP transaction and is harder to manipulate.

You will see the results in your aggregate reports: after setting p=reject, the `` field shows "reject" for failing messages. This is expected and correct. It means the policy is working.

The Safe Migration Path: Phase by Phase

Do not go from p=none to p=reject in a single step. Use three phases.

Phase 1: Set up DMARC monitoring (p=none). This is where most of the actual work happens - and it should take at least 30 days. Collect aggregate reports, identify all sending sources, and add any missing sources to SPF or configure DKIM signing for third-party tools.

DMARCFlow is the practical tool for this phase. Without it, you are parsing raw XML by hand - manually extracting sending IPs from gzipped report files, cross-referencing them against your infrastructure, and hoping you notice when a new source appears. Teams that try to do this manually either give up after a week or miss the new source that causes an outage. DMARCFlow automates all of this: it parses your aggregate reports continuously, groups sending sources, tracks failure rates, and alerts you the moment a new IP starts sending authenticated mail from your domain. That alerting capability is the safety net that makes the migration possible.

Phase 2: Set p=quarantine as a staging step. Before going to full rejection, move to p=quarantine. Receiving servers that honor this policy will move failing mail to spam instead of rejecting it outright. This gives you real-world signal about what is still failing, at lower blast radius than a full rejection.

Watch your aggregate reports during this phase. Any source showing consistent failures needs to be addressed before moving to Phase 3. If you see new failure sources during Phase 2 that were not present in Phase 1, investigate immediately.

Phase 3: Set p=reject once failures are near zero. The transition to p=reject should happen only when your aggregate reports show consistent near-zero failures across all known sending sources. "Near zero" means occasional individual failures from misconfigured third-party tools, not systematic failures from unknown sources.

During the first week after setting p=reject, check your aggregate reports daily. Set up DMARCFlow alerts for failure spikes so you catch problems before users report them. If a SaaS tool gets reconfigured and starts sending from a new IP, you want to know within hours, not days.

SaaS Blind Spot - The Most Common Migration Failure

Third-party tools that send from your domain without proper SPF or DKIM coverage are the most common cause of post-migration email breakage. This is the SaaS blind spot.

The pattern: your domain is example.com. You use Microsoft 365 for internal mail and Salesforce for CRM. Salesforce sends marketing email from the domain example.com using its own sending infrastructure. If Salesforce's sending IPs are not in your SPF record and Salesforce does not DKIM-sign with your domain, those messages fail DMARC.

When you set p=reject, Salesforce marketing mail to recipients at domains that enforce DMARC starts bouncing. This is not hypothetical - it happens in almost every first migration.

The fix is straightforward: add the SaaS provider's SPF include mechanism to your SPF record, or configure the provider to DKIM-sign with your domain. Most major SaaS platforms have documentation for this. Salesforce, HubSpot, SendGrid, and others all support custom-domain sending with proper authentication.

Before your migration, go through every tool that sends mail from your domain and verify it has proper SPF or DKIM coverage. Check your aggregate reports for IPs you do not recognize - those are often SaaS tools that were added without updating DNS records.

DMARC Migration Readiness Checklist

Before you change your DMARC policy to p=reject:

  • You have collected at least 30 days of DMARC aggregate reports
  • Every IP in your aggregate reports is either in your SPF record or signing DKIM with your domain
  • You have identified every SaaS tool that sends from your domain and verified its auth coverage
  • You have tested SPF and DKIM alignment using a DMARC checker tool
  • DMARCFlow is monitoring your reports and alerting on new sending sources and failure spikes
  • Your IT team knows what to do when aggregate reports show an unexpected failure spike
  • You have completed Phase 2 (p=quarantine) and resolved every consistent failure source

If you can check every item on this list, you are ready to move to p=reject. If you are missing any item, work through it first. The DNS change is the last step, not the first.

FAQ

How long does the full migration take?

A minimum of 60 days: 30 days of aggregate report collection in Phase 1, followed by at least two weeks at p=quarantine. Complex environments with many sending sources take longer. Rushing this process is the most common cause of email breakage.

What breaks first when you set p=reject too early?

Marketing email from third-party platforms, transactional email from SaaS tools, and internal relay servers that were set up years ago and forgotten are the most common failure sources. These are also the hardest to diagnose after the fact.

Can I go straight to p=reject from p=none without p=quarantine?

Technically yes - the policy setting is a single DNS record change. Practically, skipping p=quarantine means you get no staging signal before failures start affecting users. The quarantine phase is insurance; it costs you two weeks and could save you a weekend of incident response.

Do I need expensive tooling to do this migration?

You need aggregate reports and a way to process them. Without tooling, you are reading raw XML. DMARCFlow handles the parsing, grouping, alerting, and trend tracking that makes the monitoring phase practical for teams without dedicated email auth engineers.

What is the single most important thing to do before changing the policy?

Know every IP address that sends mail from your domain. If you know your sources, you can protect them. If you do not, p=reject will find them for you - in the form of bounced mail and user complaints. DMARCFlow's sending source view gives you this inventory in one screen instead of hand-editing spreadsheets of XML data.