How to read a DMARC RUA report (and what it reveals)
By Thomas · virtual CISO · July 15, 2026
A DMARC RUA report lands in the inbox as a .xml.gz or .xml.zip attachment. Inside, XML that at first glance looks like an airport dashboard — lots of tags, little explanation. Yet once the eye knows where to look, an RUA report tells a very clear story: who sent mail in the domain's name, from where, with what result. This guide decodes the structure and names the tags that come first.
The general structure
An RUA report follows a standardized XML schema. Here's its skeletal form:
<?xml version="1.0" ?>
<feedback>
<report_metadata>
<org_name>Google Inc.</org_name>
<email>noreply-dmarc-support@google.com</email>
<report_id>3456789012345678901</report_id>
<date_range>
<begin>1719273600</begin>
<end>1719359999</end>
</date_range>
</report_metadata>
<policy_published>
<domain>example.com</domain>
<p>reject</p>
<sp>reject</sp>
<adkim>r</adkim>
<aspf>r</aspf>
</policy_published>
<record>
<row>
<source_ip>40.107.1.25</source_ip>
<count>347</count>
<policy_evaluated>
<disposition>none</disposition>
<dkim>pass</dkim>
<spf>pass</spf>
</policy_evaluated>
</row>
<identifiers>
<header_from>example.com</header_from>
</identifiers>
<auth_results>
<dkim>
<domain>example.com</domain>
<result>pass</result>
<selector>selector1</selector>
</dkim>
<spf>
<domain>example.com</domain>
<result>pass</result>
</spf>
</auth_results>
</record>
</feedback>
In reality, this skeleton will contain several <record> blocks, one per combination of source IP / authentication results observed.
The essential tags to read
report_metadata
org_name: who is sending the report. Google, Microsoft, Yahoo — it's the ISP that received and evaluated the messages.date_range: the period covered (Unix timestamps). Converting them reveals which day the report covers.report_id: the report's unique identifier, useful for referencing it when digging deeper with the ISP.
policy_published
What the ISP saw as policy at the time of the report. The <p> value should match the intended policy. A none where quarantine was set means the DNS record either hasn't propagated yet or is mis-published.
<record> — the heart of the report
Each <record> represents a group of identical messages (same IP, same results). This is where everything happens:
source_ip: the IP that sent the messages. The first question is whether it's a recognized one — an in-house server, a known sending platform?count: how many messages are grouped in this block. Acountof 347 on a recognized IP is normal. Acountof 12 on an unknown IP deserves investigation.policy_evaluated→disposition: what the receiver actually did with the message (none,quarantine,reject). Adisposition=nonewithp=rejectmay indicate the ISP has a local override or the message is let through due to a trust agreement.policy_evaluated→dkimandspf: the DKIM and SPF result after alignment. This is what matters for DMARC, not the raw results inauth_results.header_from: theFrom:domain of the email. It should always be the domain being reported on.
auth_results
The raw SPF and DKIM results, before alignment evaluation. Useful for diagnosis:
- If
auth_results/dkim/result=passbutpolicy_evaluated/dkim=fail, the DKIM signature is valid but not aligned — thedomaininauth_results/dkimdiffers fromheader_from. Classic case: a platform signing with its own domain. - If
auth_results/spf/result=passbutpolicy_evaluated/spf=fail, same logic: SPF passes for the envelope, but the envelope isn't the domain inheader_from.
Reading a report in practice: the reading flow
When a report arrives, the reading goes in this order:
org_name— who is sending it (Gmail, Outlook, Yahoo…).date_range— what period (yesterday? two days ago?).policy_published/p— is the policy visible correctly?- For each
<record>:source_ip: is this IP a known one?count: how many messages?policy_evaluated/dkimandspf: does it pass or fail?- If it fails: why?
auth_resultscarries the detail.
A few minutes with this flow settle both questions: whether the legitimate sources pass, and whether suspicious IPs are sending in the domain's name.
What a report reveals about the actual posture
An RUA report isn't just a list of results — it's a snapshot of the authentication posture. A careful reading, <record> block by <record> block, reconstructs a precise picture of the situation: which sources work, which are broken, and which had never been identified at all. That last point is often the most revealing: DMARC reports regularly uncover sending sources that organizations have forgotten — an old application, a vendor whose service was dropped long ago but whose DNS configuration was never cleaned up, a SaaS tool quietly sending notifications in the company's name.
To get the most out of a report, the reading has to go beyond source by source and look for patterns: are failures concentrated on a few IPs or scattered across many? Do the same IPs fail in reports from multiple ISPs or only one? Is the failure volume increasing over time? These questions transform a one-off diagnostic into a systemic understanding of the posture.
The red flags to watch for
A few configurations in a report should immediately catch the eye. A high count on an unknown IP: someone is sending large volumes of messages claiming the domain's identity, from an IP nobody recognizes. At p=none, those messages are being delivered — under the domain's brand. Sudden failures on a recognized IP: a configuration changed somewhere (poorly executed DKIM key rotation, SPF configuration change, provider switch). policy_published/p different from the declared policy: the record isn't correctly published, or an unwanted change was made. These three signals deserve immediate investigation, independent of the rest of the report.
A fourth signal deserves the same reflex: a header_from showing an unused subdomain. Reports don't only cover the main domain — when a message claims to come from a subdomain, the corresponding <record> block shows it in header_from, and it's the <sp> tag of the policy that applies there. A legitimate sender can live there (a platform configured on a dedicated subdomain), but so can a spoofer: subdomains are often watched less closely than the root, which is exactly what makes them attractive. Scanning the header_from values in each report, not just the IPs, is the habit that pays — an unexpected subdomain is a discovery in its own right, just like an unknown address.
Identifying the sources in the reports
A raw report gives an IP. A well-used report gives the owner of that IP. That conversion — IP → identified sending service — is what turns a report into an action plan. An unrecognized IP calls for a quick reverse DNS lookup (nslookup IP or dig -x IP). The result often names the hosting provider or cloud platform the IP belongs to. Cross-referencing with the list of known sending services then does the rest: a marketing platform on that cloud? A transactional email provider? An old CRM that may still be sending? An IP that resolves to nothing recognizable stays suspicious — not necessarily a threat, but not something to mark as legitimate without investigation.
Why an analysis tool makes the difference
A single Gmail report can sometimes contain dozens of <record> blocks. Multiplied by reports from Microsoft, Yahoo, Apple, and others, manual reading quickly becomes exhausting. DMARC analysis tools aggregate these reports, enrich them with IP identity (hosting providers, known platforms), and present a consolidated view. Our analyzer does exactly that: it reads the reports, identifies the sources, and shows the status of each — with no XML file ever opened by hand.
Frequently asked questions
Reports arrive as .gz or .zip. How do they open? Decompressing the file (gunzip on Mac/Linux, 7-Zip or WinRAR on Windows) yields the .xml, which any text editor or browser will display. Better yet: an analysis tool that does it automatically.
Why do several reports arrive per day? Generally they don't — it's one per sender per day (24-hour period by default). Several from the same actor may be a split, where volume is very high.
I see disposition=quarantine but my policy is p=reject. Why? The policy_evaluated/disposition reflects what the ISP actually applied, not the declared policy. Some actors have overrides (whitelists, bilateral agreements) that soften enforcement. This is not a configuration error.
No reports arrive at all. What's happening? The DMARC record has to be published and contain rua=mailto:address@example.com. The receiving address also has to be reachable, with the messages not ending up in spam. And if the rua= address sits on an external domain, that domain must carry an authorization _dmarc record.
Does every email sent generate a report? No. Reports are aggregated: one block per IP/results combination over the period. 1000 emails from the same IP with the same results = 1 <record> with count=1000.
What to do about an unrecognized IP? Resolving it via reverse DNS (nslookup IP or dig -x IP) comes first, to see which service it belongs to. A known cloud provider might point to an old VM or a forgotten service. An unknown range with no clear reverse DNS is a red flag — possibly impersonation. In any case, it stays off the "legitimate" list until its source has been identified with certainty.
Do reports include messages rejected by my own spam filter? No. RUA reports cover messages that reached the recipient server and were evaluated by DMARC. Messages rejected before DMARC evaluation (TCP connection blocked, SMTP rejection) don't appear.
Do reports reflect all my emails or only some? Only messages that arrive at recipients whose ISP sends DMARC reports. Mail sent to a domain that hasn't implemented reporting doesn't appear — even under an active policy. That's why data from major ISPs (Gmail, Outlook, Yahoo) is most representative: they cover the bulk of global traffic.
Letting Thomas decode the reports
Opening and decoding XML by hand is doable — but tedious, and potentially misleading for anyone who doesn't know where to look. Thomas, the virtual CISO, reads the reports continuously, names the sources that pass and those that deserve attention, and presents a clear diagnosis without raw XML.
Analyze a domain for free or create an account for DMARC reports readable at a glance.
Related guides
- How to read DMARC aggregate (RUA) reports
DMARC aggregate reports are the map to enforcement. What's inside the XML, how to read it, and how daily reports turn into a path to p=reject.
- The best tools to analyze DMARC reports
DMARC reports are raw XML. Tools exist to aggregate, visualize and turn them into an action plan. An overview of free and paid options, and how to choose.
- DMARC reports: RUA vs RUF, what's the difference?
DMARC RUA reports aggregate statistics, RUF detail a single failed message. Contents, who still sends them, privacy risks, and which one truly matters.
About the author
Thomas — Thomas is the virtual CISO of DMARC.com: a copilot specialized in email authentication that walks organizations from p=none to p=reject without breaking their mail. His guides draw on real data from the DMARC Observatory and the RUA reports the platform analyzes.
