Muhammad Basim
Email Marketing

How to Read DMARC Reports Without a Paid Tool

Muhammad Basim
Muhammad Basim
··8 min read

A DMARC aggregate report is a gzipped XML file sent daily by a receiving provider, listing every IP address that sent mail claiming to be from your domain and whether each one passed SPF, DKIM, and alignment. Reports arrive at the address in the rua tag of your DMARC record, one per provider per day.

The XML is machine-readable rather than deliberately obscure. A domain with a handful of sending services can be monitored by reading the reports directly, and the fields that matter number about eight.


What arrives, and from whom

Sender What they send Frequency
Google Aggregate report for all Gmail-received mail Daily
Yahoo Aggregate report Daily
Microsoft Aggregate report Daily
Smaller providers and forwarders Aggregate reports of varying completeness Daily to weekly

Each file is a .gz or .zip containing one XML document covering a 24-hour window. Volume scales with the number of providers your recipients use, not with your list size — a small sender still receives several files a day.

Aggregate reports contain no message content. They report counts by source IP and authentication outcome. Forensic reports (ruf) do contain message detail, and most providers do not send them for privacy reasons.


The structure of a DMARC report

Every report has three parts.

Part 1 — Report metadata

<report_metadata>
  <org_name>google.com</org_name>
  <email>noreply-dmarc-support@google.com</email>
  <report_id>1234567890123456789</report_id>
  <date_range>
    <begin>1755993600</begin>
    <end>1756080000</end>
  </date_range>
</report_metadata>

org_name identifies who sent the report. The date_range values are Unix timestamps covering the reporting window.

Part 2 — Published policy

<policy_published>
  <domain>yourdomain.com</domain>
  <adkim>r</adkim>
  <aspf>r</aspf>
  <p>none</p>
  <sp>none</sp>
  <pct>100</pct>
</policy_published>

This is the provider's reading of your DMARC record at the time of the report. Checking it against what you intended to publish catches DNS mistakes — a record showing p=none when you set p=quarantine means the change never propagated or a second record exists.

Part 3 — Records

The part that matters. One <record> block per sending IP address.

<record>
  <row>
    <source_ip>203.0.113.45</source_ip>
    <count>1250</count>
    <policy_evaluated>
      <disposition>none</disposition>
      <dkim>pass</dkim>
      <spf>fail</spf>
    </policy_evaluated>
  </row>
  <identifiers>
    <header_from>yourdomain.com</header_from>
  </identifiers>
  <auth_results>
    <dkim>
      <domain>yourdomain.com</domain>
      <result>pass</result>
      <selector>s1</selector>
    </dkim>
    <spf>
      <domain>mail.esp-provider.com</domain>
      <result>pass</result>
    </spf>
  </auth_results>
</record>

What each field actually tells you

Field Meaning
source_ip The server that sent the mail. Identifies the service
count How many messages that IP sent in the window
disposition What the receiver did: none, quarantine, or reject
policy_evaluated/dkim Whether DKIM aligned — not merely whether it passed
policy_evaluated/spf Whether SPF aligned — not merely whether it passed
header_from The domain in the visible From address
auth_results/dkim/domain The domain DKIM actually signed as
auth_results/spf/domain The domain SPF actually validated

The single most important distinction in the whole report: policy_evaluated reports alignment, auth_results reports the raw pass or fail.

In the example above, auth_results shows SPF passing — and policy_evaluated shows SPF failing. Both are correct. SPF validated mail.esp-provider.com, the visible From domain is yourdomain.com, and those do not align. DKIM saved the message, because DKIM signed under the right domain.

That pattern is the mechanism behind "everything passes but DMARC fails", explained in full in email authentication: SPF, DKIM, DMARC and BIMI.


How to read a report in ten minutes

Five steps, repeatable weekly.

Step 1 — Unzip and open the file

The attachment is a .gz or .zip containing one XML file. Any text editor opens it; a browser renders it with collapsible nodes, which is easier for a first pass.

Step 2 — Check the published policy against what you intended

Compare policy_published against your DMARC record. A mismatch means a propagation delay, a typo, or a duplicate record — and it invalidates any conclusion drawn from the rest of the report.

Step 3 — Sort records by count, descending

The highest-volume sources are your real sending services. Reading in volume order puts the meaningful entries first and the noise last.

Step 4 — Categorise every source

What you see What it means Action
High count, dkim: pass in policy_evaluated A correctly configured service None
High count, both policy_evaluated results fail A legitimate service that is not authenticated, or a spoofer Identify the IP before doing anything
High count, raw results pass but policy_evaluated fails Misalignment — signing under the platform's domain Configure custom domain authentication
Low count, mixed results Usually a forwarder Tolerate
Unfamiliar IP, meaningful volume, everything failing Possible spoofing Investigate before tightening policy

Identify unfamiliar IP addresses before assuming spoofing. A reverse DNS lookup on the IP usually names the service, and the answer is frequently a tool a colleague set up months ago.

Step 5 — Record what you learned

Keep a running list of every source with its status. That list is the inventory that governs when the DMARC policy can safely tighten, described in how to set up DMARC safely.


Why legitimate mail fails DMARC

Four causes account for nearly all legitimate failures.

Misalignment. The service authenticates under its own domain. Fixed in the platform's domain authentication settings.

Forwarding. A recipient forwards to another address, and the forwarding server rewrites the path. SPF breaks; DKIM usually survives, which is why DKIM alignment is the more resilient of the two.

Mailing lists. Discussion lists modify subject lines and add footers, breaking the DKIM signature. Well-configured lists rewrite the From address to avoid the problem.

A missed sending service. A tool that sends as your domain without ever being added to SPF or configured for DKIM.

Forwarding failures are the reason to reach enforcement via DKIM alignment rather than SPF alignment. A message that survives forwarding is one whose DKIM signature aligned.


When a paid DMARC analyzer earns its cost

Reading raw XML is practical up to a point, and past that point it stops being a good use of anyone's time.

Situation Manual reading Paid analyser
One domain, three or four sending services Practical Unnecessary
One domain, ten or more sending services Tedious Worth it
Multiple domains Impractical Necessary
Moving to enforcement on a complex estate Risky Necessary
Ongoing monitoring after reaching p=reject Adequate Convenient

What an analyser genuinely adds: source identification by name rather than IP, trend charts across weeks, alerting on new sources, and forensic detail on failures. What it does not add is any authority — the underlying data is identical to the XML in your inbox.

Free tiers exist at most analyser vendors and generally cover one domain at low volume, which suits exactly the sender who would otherwise read the XML manually.

What's in the book, not here. The weekly report-review routine and the thresholds that should trigger action are in The Email Deliverability Playbook.


Frequently asked questions

What is a DMARC aggregate report?
A DMARC aggregate report is a gzipped XML file sent daily by a receiving provider, listing every IP address that sent mail claiming to be from your domain and whether each passed SPF, DKIM, and alignment. Reports arrive at the address in the rua tag and contain no message content.

Why am I getting DMARC failures from my own domain?
Usually misalignment rather than a genuine failure. A sending platform that signs DKIM under its own domain produces a raw pass in auth_results and a fail in policy_evaluated, because the authenticated domain does not match the visible From domain.

Are DMARC analyzers worth paying for?
Not for a single domain with three or four sending services, where the XML is readable directly. They become worthwhile at ten or more sending services, across multiple domains, or when moving a complex estate to enforcement.

What is the difference between policy_evaluated and auth_results?
policy_evaluated reports whether SPF and DKIM aligned with the visible From domain, which is what DMARC actually judges. auth_results reports the raw pass or fail of each check regardless of alignment. A record can show a pass in one and a fail in the other.

Do DMARC reports contain the content of my emails?
Aggregate reports do not. They report counts by source IP and authentication outcome only. Forensic reports, requested with the ruf tag, can contain message detail, and most providers do not send them for privacy reasons.

Why does forwarded email fail DMARC?
Forwarding servers rewrite the return path, which breaks SPF, while the DKIM signature usually survives intact. A message that aligns on DKIM survives forwarding, which is why DKIM alignment is the more resilient route to enforcement.

How often do DMARC reports arrive?
Once per day per reporting provider, covering a 24-hour window. Volume depends on how many different providers your recipients use rather than on the size of your list, so even small senders receive several files a day.


What to do next

Open the most recent report and check policy_published against your DMARC record. That single comparison catches DNS mistakes that would otherwise invalidate weeks of observation.

Then sort the records by count and identify the top three sources. Those are your real sending services, and their alignment status is what determines whether the policy can tighten.

Free: The 60-Minute Email Authentication Fix — verify SPF, DKIM, DMARC, and alignment on your own domain.

Go deeper: The Email Deliverability Playbook — the weekly review routine and the thresholds that trigger action.


Related guides

The short version

  1. Unzip and open the fileThe attachment is a .gz or .zip containing one XML document. Any text editor opens it, and a browser renders it with collapsible nodes for an easier first pass.
  2. Check the published policy against what you intendedCompare the policy_published block with your DMARC record. A mismatch means a propagation delay, a typo, or a duplicate record.
  3. Sort records by count, descendingThe highest-volume sources are your real sending services, so reading in volume order puts the meaningful entries first.
  4. Categorise every sourceSort each into correctly configured, misaligned, unauthenticated, forwarder, or possible spoofing. Run a reverse DNS lookup on unfamiliar IP addresses before assuming spoofing.
  5. Record what you learnedKeep a running list of every source with its status. That list governs when the DMARC policy can safely tighten.

Free: The 60-Minute Email Authentication Fix

A no-fluff checklist to set up SPF, DKIM & DMARC correctly and pass Gmail & Yahoo's sender requirements.

Muhammad Basim

About the Author

Muhammad Basim

Digital Marketing Practitioner & Author

Muhammad Basim has worked in digital marketing since 2013, focused on email deliverability and AI-assisted content production. He is the author of the Email Deliverability Playbook and the Email Copywriting Playbook, and has run 100+ email campaigns for ecommerce brands, coaches, and B2B senders. He writes about email, SEO, WordPress, and AI — with a bias toward what can be tested over what sounds good.

Related Articles

Newsletter

Free: The 60-Minute
Email Authentication Fix

A no-fluff checklist from the Deliverability Playbook. In one hour: set up SPF, DKIM & DMARC correctly, check your domain against blocklists, and pass Gmail & Yahoo's 2026 sender requirements.

No spam — that would be ironic. Unsubscribe anytime.