DMARC Explained: How to Stop Domain Spoofing

Email spoofing remains one of the most effective attack vectors for cybercriminals. SPF and DKIM provide authentication, but they lack enforcement. DMARC closes this gap by telling receiving mail servers what to do when an email fails authentication.

This guide explains DMARC – how it works, how to implement it, and what changed in 2026.

TL;DR

  • DMARC (Domain‑based Message Authentication, Reporting & Conformance) tells receiving mail servers what to do when an email fails SPF or DKIM authentication. It provides the enforcement mechanism that SPF and DKIM lack.
  • In May 2026, the IETF published RFC 9989, 9990, and 9991, moving DMARC from Informational to Standards Track. The pct= and rf= tags are deprecated, and new tags (np=, psd=) have been introduced.
  • DMARC has three policy levels: p=none (monitor only), p=quarantine (send to spam), and p=reject (block). Only p=reject provides full protection against domain spoofing.
  • Only 10.7% of domains globally have full p=reject enforcement, leaving the vast majority vulnerable to impersonation attacks. DMARC adoption has reached 52.1% (937,931 domains) in 2026, up from 47.7% in 2025.
  • DMARC alignment requires that the domain in the header From matches either the domain authenticated by SPF or the domain authenticated by DKIM. Without alignment, even a passing SPF or DKIM check will fail DMARC.

What Is DMARC?

DMARC (Domain‑based Message Authentication, Reporting & Conformance) is an email authentication protocol that builds on SPF and DKIM. It was originally defined in RFC 7489 (2015). In May 2026, the IETF published RFC 9989, 9990, and 9991, moving DMARC from Informational to Standards Track.

What DMARC does:

  • Verifies alignment – checks that the domain in the header From matches the domain authenticated by SPF or DKIM
  • Defines policy – tells receiving servers what to do with unauthenticated email (none, quarantine, or reject)
  • Provides reporting – sends aggregate (RUA) and forensic (RUF) reports about email authentication activity

The problem DMARC solves: SPF and DKIM alone are not enough. SPF only checks the envelope sender; DKIM only verifies signatures. Neither prevents an attacker from spoofing the header From address that users actually see. DMARC bridges this gap by requiring alignment and enforcing policy.

How DMARC Works Step by Step

How DMARC authentication works. The receiving server checks SPF and DKIM, evaluates domain alignment, determines whether DMARC passes or fails, and applies the configured policy: monitor, quarantine, or reject.

Alignment Requirements

For DMARC to pass, at least one of the following must be true:

  • SPF alignment: The domain in the Return‑Path matches the domain in the header From
  • DKIM alignment: The domain in the DKIM signature (d=) matches the domain in the header From

Alignment can be:

  • r (relaxed): Allows subdomain matches (e.g., sub.example.com aligns with example.com)
  • s (strict): Requires an exact match

DMARC Record Syntax (Updated for 2026)

Basic Structure

v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-forensic@example.com; sp=reject

Components

TagMeaningRequired
v=DMARC1Version identifierYes – Required
p=Policy (none / quarantine / reject)Yes -Required
sp=Subdomain policyOptional
np=Non‑existent subdomain policy (new in RFC 9989)Optional
rua=Aggregate report destinationOptional
ruf=Forensic report destinationOptional
psd=Public Suffix Domain (new in RFC 9989)Optional

Deprecated Tags (RFC 9989)

TagStatusReplacement
pct=DeprecatedUse t=y for testing instead
rf=DeprecatedReport format is now standardised
ri=DeprecatedReport interval is now managed by receivers

New Tags in RFC 9989

np= (Non‑existent subdomain policy): Defines how to handle messages from subdomains that do not exist. Can be set to none, quarantine, or reject.

psd= (Public Suffix Domain): Replaces the Public Suffix List with DNS Tree Walk and Public Suffix Domains (PSD). Options:

  • psd=y – treat the domain as an organisational domain
  • psd=n – do not treat as an organisational domain
  • psd=u – unknown (default behaviour)

t=y (Test mode): Indicates that the published DMARC policy should not be applied – acts like pct=0.

Example modern DMARC record (RFC 9989):

v=DMARC1; p=reject; np=quarantine; psd=y; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-forensic@example.com

DMARC Policy Options

PolicyEffectWhen to Use
p=noneMonitor only – reports sent, no actionInitial deployment, data collection
p=quarantineMark suspicious emails as spamAfter identifying all legitimate senders
p=rejectBlock unauthenticated emailsFull protection

Policy Progression

The safest DMARC configuration strategy is to start with p=none, monitor authentication reports, and gradually move to p=quarantine and p=reject enforcement:

  1. Phase 1: p=none (Monitoring) – Collect data for 30–60 days. Identify all legitimate sending sources.
  2. Phase 2: p=quarantine (Testing) – Test enforcement. Identify and fix any remaining issues.
  3. Phase 3: p=reject (Full protection) – Block all unauthenticated emails.

DMARC Reporting

Aggregate Reports (RUA)

  • Format: XML
  • Content: Summary of all authentication results, including source IPs, message counts, SPF/DKIM results, and DMARC disposition
  • Frequency: Daily
  • Purpose: Monitor authentication performance and identify legitimate senders

Forensic Reports (RUF)

  • Format: XML (standardised by RFC 9991 in May 2026)
  • Content: Per‑message failure details, including sender IP, From/Return‑Path mismatch, and the specific mechanism that failed
  • Frequency: Per failure event
  • Purpose: Debug authentication failures

RUF best practices: Enable ruf= only if you have a dedicated processor for the data. Forensic reports can contain sensitive information – handle with care.

Implementation Phases

PhasePolicyDurationPurpose
1p=none30–60 daysCollect data, identify all senders
2p=quarantine30+ daysTest enforcement, identify issues
3p=rejectPermanentFull protection

Google Workspace Recommendation

Google recommends starting with p=none for one week, monitoring reports, then moving to p=quarantine for a small percentage of messages before full rollout.

DMARC Adoption Statistics (2026)

MetricValueSource
DMARC adoption52.1% (937,931 domains)EasyDMARC 2026
Domains with enforcement (p=quarantine or p=reject)22.9% (411,935 domains)EasyDMARC 2026
Domains with full p=reject protection10.7%DmarcDkim.com
Fortune 500 with DMARC95%EasyDMARC 2026
Fortune 500 with enforcement80%+EasyDMARC 2026
Fortune Global 500 with enforcement63%SimpleDMARC 2026
Fortune Global 500 with p=reject48%SimpleDMARC 2026
Domains with no DMARC record20.6% of Fortune Global 500SimpleDMARC 2026

Key insight: While DMARC adoption has grown significantly, only 10.7% of domains have full p=reject protection. The vast majority remain vulnerable to impersonation attacks.

Common DMARC Mistakes

MistakeWhy It’s a ProblemFix
Staying on p=none indefinitelyNo enforcement – attackers still succeedMove to p=quarantine then p=reject
Missing alignmentSPF/DKIM pass but don’t align with header FromEnsure SPF and DKIM domains match header From
Not monitoring reportsNo visibility into who is sending using your domainSet up RUA and RUF reporting
Invalid syntaxRecord is ignored or misinterpretedValidate your DMARC record
Not implementing subdomain policyAttackers can spoof subdomainsAdd sp=reject for subdomains
Using deprecated tagsTags like pct=, rf=, ri= are ignored in RFC 9989Remove deprecated tags
Not using np= for non‑existent subdomainsAttackers can spoof subdomains that don’t existAdd np=reject

Testing DMARC

Online Tools

ToolPurpose
MXToolbox DMARC CheckValidates DMARC record existence and syntax
dmarcian DMARC CheckComprehensive DMARC validation
Google Admin ToolboxEmail header analyser

Command Line

dig TXT _dmarc.example.com +short

Expected output:

"v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com"

Email Header Inspection

Look for:

Authentication-Results: dmarc=pass header.from=example.com;

A pass result means DMARC successfully authenticated the email.

DMARC Best Practices (2026)

  1. Start with p=none to collect data. Monitor aggregate reports for 30–60 days.
  2. Identify all legitimate sending sources. Include marketing platforms, transactional email, CRMs, and cloud services.
  3. Move to p=quarantine after verification. Test enforcement and identify any remaining issues.
  4. Move to p=reject after 90+ days. Full protection.
  5. Configure subdomain policy. Use sp=reject for subdomains.
  6. Use the new np= tag. Set np=reject for non‑existent subdomains.
  7. Set up both RUA and RUF reporting. Monitor authentication performance.
  8. Remove deprecated tags. pct=, rf=, and ri= are no longer used.
  9. Use relaxed alignment (adkim=r; aspf=r) for initial deployment, then consider strict later.
  10. Monitor reports continuously. DMARC is not a set‑and‑forget solution.

What Changed in 2026 (RFC 9989, 9990, 9991)

In May 2026, the IETF published three documents that update the DMARC protocol:

Key changes:

ChangeImpact
Moved to Standards TrackDMARC is now an IETF Proposed Standard
Public Suffix List replacedNow uses DNS Tree Walk and Public Suffix Domains (PSD)
pct= deprecatedUse t=y for testing instead
rf= deprecatedReport format is now standardised
ri= deprecatedReport interval now managed by receivers
np= addedPolicy for non‑existent subdomains
psd= addedPublic Suffix Domain handling

Action required: Review and update your DMARC records to remove deprecated tags and add the new np= tag.

Key Takeaways

  • DMARC provides enforcement that SPF and DKIM lack, telling receiving servers what to do with unauthenticated email.
  • Only 10.7% of domains have full p=reject enforcement, leaving the vast majority vulnerable to impersonation attacks.
  • DMARC alignment requires the header From domain to match either the SPF or DKIM authenticated domain.
  • DMARC reporting provides visibility into who is sending email using your domain, including attackers.
  • Implementation follows a progression: p=nonep=quarantinep=reject.
  • RFC 9989 (May 2026) introduced new tags (np=, psd=) and deprecated pct=, rf=, and ri=.
  • DMARC is now an IETF Standards Track protocol, not merely Informational.

Conclusion

DMARC is the enforcement layer that SPF and DKIM lack. By telling receiving mail servers what to do with unauthenticated email – monitor, quarantine, or reject – DMARC provides the protection that stops domain spoofing.

In May 2026, the IETF published RFC 9989, 9990, and 9991, moving DMARC to Standards Track and introducing new tags (np=, psd=) while deprecating others (pct=, rf=, ri=). Organisations must update their DMARC records accordingly.

Implementation follows a clear progression: start with p=none to collect data, move to p=quarantine to test enforcement, then p=reject for full protection. Monitor aggregate and forensic reports throughout to identify legitimate senders and debug failures.

The cost of non‑compliance is significant. DMARC adoption has reached 52.1% of domains, but only 10.7% have full p=reject enforcement – leaving the vast majority vulnerable to impersonation attacks. By implementing DMARC correctly, you protect your brand, your customers, and your business.

Resources

Need help setting up email authentication for your domain? Playful Sparkle has been engineering digital products since 2004, offering Web Development, App Development, and security consulting services. Our team can help you configure SPF, DKIM, DMARC, and BIMI for your domain. Contact us to discuss how we can help you secure your email.

Was this helpful - Post
Zsolt Oroszlány

Zsolt Oroszlány

Founder & Chief Creative Officer of Playful Sparkle since 2004, combining business leadership, digital strategy, design, and software engineering to help organizations build effective digital solutions. Regularly publishes insights on web development, SEO, design, and emerging technologies.