Blog · Dmarc
The DMARC Implementation Mistakes That Break Email (And How to Avoid Them)
Moving to DMARC p=reject breaks more legitimate email than almost anything else in email infrastructure. Not because DMARC is broken, but because most implementations skip steps.
Here is what goes wrong, and how to do it right.
---
Why DMARC p=reject Breaks More Mail Than It Protects (When Done Wrong)
DMARC p=reject tells receiving mail servers to reject any message that fails DMARC check. That is the goal. But it means legitimate email that fails DMARC gets rejected too, and there are more ways for legitimate email to fail than most people realize.
The problem is not the DNS record. The problem is treating DMARC p=reject as a flip rather than a migration.
---
The Five Most Common DMARC Implementation Mistakes
Mistake 1: Moving to p=reject Without Valid SPF and DKIM
This is the most common mistake. An organization sets p=reject before it has valid SPF and DKIM for all legitimate sending sources.
SPF validates the sending mail server IP against the domain's SPF record. DKIM cryptographically signs the message and the receiving server validates that signature against DNS. Without both passing, DMARC fails.
Real example: your marketing team starts using a new email service provider. Nobody adds the new IP to your SPF record. All marketing emails start bouncing because they fail SPF, which means they fail DMARC.
Mistake 2: Ignoring DMARC Alignment
This is the step that catches almost everyone.
An email has two separate domains. The RFC5321.MailFrom domain (also called envelope-from or bounce domain) is what SMTP servers use. SPF validates against this domain. The RFC5322.From domain is what the recipient sees in their email client.
DMARC alignment means the domain used in the SPF check or the DKIM signature must match the From domain. Your SPF record can be valid. Your DKIM signature can be valid. But if the DKIM signing domain does not match your From domain, DMARC fails.
This trips up organizations that use subdomains for different sending channels, or that use third-party mailing platforms that sign with their own domain rather than yours.
Mistake 3: Forgetting Third-Party Senders and Forwarding Chains
When you set p=reject, you are protecting your domain from spoofing. But you are also telling receiving servers to reject any message that appears to come from your domain but does not pass DMARC.
This catches legitimate messages from third-party senders you did not know about: billing platforms, HR systems, CRM tools, legacy apps that still send from your domain.
It also catches forwarding chains. If a user forwards your email to someone at another domain, and that domain's mail server performs a DMARC check, the forwarded message may fail because the forwarding server is not in your SPF record.
You need a complete inventory of every service that sends email from your domain before you move to p=reject.
Mistake 4: Not Reading Aggregate Reports Before Switching Policy
DMARC aggregate reports (RUA reports) show you exactly which sending IPs and domains are sending email on behalf of your domain, which mechanisms pass or fail, and what percentage fail DMARC alignment. They arrive daily from every major receiving mail provider.
Most organizations move to p=reject without ever reading these reports. They switch blind, then get surprised when mail starts bouncing.
Aggregate reports tell you which senders are not aligned, which IPs are missing from SPF, and which receiving domains are seeing the most failures. That information is exactly what you need to fix problems before they become rejections.
Mistake 5: Setting p=reject Without a Rollback Plan
When things go wrong, some organizations have no fast way to revert. They changed the DNS record, mail broke, and now they are stuck waiting for DNS TTL to expire before they can undo the change.
If your p=reject policy is live and mail is breaking, the fastest fix is to change the policy back to p=none. But if your TTL is 24 hours, you are waiting a day to undo a 5-minute change.
Set a low TTL on your DMARC record before you start the migration. 300 seconds (5 minutes) is reasonable. This way, if something goes wrong, you can revert quickly.
---
How to Implement DMARC p=reject the Right Way
Follow this sequence. Skipping steps is how organizations break mail.
Step 1: Discover Your Email Senders
Before you touch your DMARC record, build a complete inventory of every service that sends email from your domain. Include your own mail servers, cloud services, marketing platforms, transactional email services, legacy applications, and any automated systems.
For each sender, record the sending IP, the RFC5321.MailFrom domain it uses, and whether it signs with DKIM and which domain it uses.
DMARCFlow's sender discovery feature scans your DNS and inbound mail flow to surface senders you have not accounted for. This is the step most organizations skip, and it is the one that causes the most problems later.
Step 2: Validate SPF, DKIM, and Alignment for Each Sender
Run each sender through a DMARC checker. Verify the sending IP is in your SPF record. Verify your DKIM record is published and the selector is correct. Verify the DKIM signature uses your From domain or a subdomain that aligns with it. Verify the RFC5321.MailFrom domain matches or aligns with your From domain.
Fix any failures before proceeding.
Step 3: Set p=none and Monitor for 2-4 Weeks
Publish p=none and wait. Read your aggregate reports every day. Look for senders you did not know about, high failure rates from specific receivers, and alignment failures you missed in Step 2.
2-4 weeks gives you a full picture including senders with periodic schedules (monthly newsletters, quarterly statements, etc.).
Step 4: Move to p=quarantine, Fix Failures
After you have zero failures in aggregate reports for at least a week, change p=none to p=quarantine. This tells receivers to mark failing mail as spam rather than reject it. Monitor reports for another 1-2 weeks.
Step 5: Move to p=reject Once Failures Are Zero
Only when aggregate reports show zero failures across all senders for an extended period should you move to p=reject. Then keep reading aggregate reports weekly forever. New senders get added. SPF records get stale. DKIM keys get rotated incorrectly. Ongoing monitoring is not optional.
DMARCFlow automates this monitoring and alerts you when new senders appear or when failure rates change. For small teams without a dedicated email security person, that automated watch is worth more than the manual process.
---
How to Recover If Your DMARC Policy Is Already Breaking Mail
If you are reading this because mail is already broken:
1. Change your DMARC record from p=reject to p=none immediately. If your TTL is long, lower it first, wait, then change.
2. Check aggregate reports from the last 24-48 hours. Look for which receivers are rejecting, which IPs are failing, and which mechanism is failing (SPF, DKIM, or alignment).
3. Identify the sender that is failing and either fix its SPF/DKIM configuration or exclude it from the main policy using a subdomain with its own DMARC record.
4. Once the failing sender is fixed, move back through the migration sequence: p=none, monitor, p=quarantine, then p=reject.
Organizations with DMARCFlow monitoring in place typically recover within hours because the aggregate reports show exactly which sender caused the problem. Organizations without monitoring typically take days because they are working from user complaints and server logs.
---
FAQ
Why is our DMARC policy rejecting legitimate email?
The most common reasons are: SPF or DKIM is not valid for a sender, DMARC alignment is failing (the signing domain does not match your From domain), or a third-party sender you did not account for is sending from your domain.
How long should we monitor at p=none before moving to p=reject?
A minimum of 2-4 weeks at p=none is standard practice. Longer is better if you have periodic senders (monthly newsletters, quarterly statements) that you need to see in your aggregate reports before committing to p=reject.
What is the most common DMARC mistake?
Moving to p=reject before validating DMARC alignment for all sending sources. Most organizations check SPF and DKIM but skip the alignment check, which is what causes rejections even when both mechanisms appear valid.
Can we exclude one sender from DMARC without weakening the whole policy?
Yes. Create a separate DMARC record for the subdomain that handles that sender. This lets you move the main domain to p=reject while giving the problematic sender its own more permissive policy.
Do forwarding chains break DMARC?
Sometimes. Forwarding can cause DMARC failures when the forwarding server is not in your SPF record and the DKIM signature does not survive the forwarding process. This is a known limitation of DMARC, not a misconfiguration on your end.