DMARC Aggregate (RUA) Reports Explained: XML Schema, Delivery, RUF Forensic Reports (RFC 7489 §7.2, §7.3)
A practitioner reference for DMARC aggregate (RUA) reports: the daily XML stream receivers send back to domain owners, with every authentication outcome per sending IP. Covers the XML schema (feedback / report_metadata / policy_published / record), the delivery mechanism (gz email attachments named receiver!sender-domain!begin!end.xml.gz), a worked report example, operational reading patterns, and the forensic (RUF) sibling defined in RFC 7489 §7.3.
This reference is provided in English. DMARC aggregate reports are specified in English-language RFCs (RFC 7489 §7.2 + Appendix C) and the canonical XML element names (feedback, report_metadata, policy_published, record, row, identifiers, auth_results, dkim_eval, spf_eval, disposition) are XML identifiers that do not translate. We keep the body in the source language so technical terms remain consistent with the specifications.
TL;DR
- DMARC aggregate reports
(also called RUA reports
after the
rua=tag that publishes the destination) are daily XML documents receivers send back to domain owners summarising how mail claiming to be from the domain was processed. Defined in RFC 7489 §7.2. - The report is grouped by
source IP with per-group
message counts, SPF / DKIM authentication
results, alignment outcome, and the
disposition
(
none,quarantine, orreject) the receiver applied. - The XML root is
<feedback>with three child element types:<report_metadata>(sender identity + reporting window),<policy_published>(the DMARC record the receiver saw), and one or more<record>elements (one per source-IP / authentication-result combination). - Delivery: email
attachment, gzip-compressed XML
(
.xml.gz) or ZIP, filename conventionreceiver!sender-domain!begin-ts!end-ts.xml.gz. Reports arrive at the mailbox(es) listed in therua=tag. - Cadence: one report per
receiver-sender pair per day by default
(
ri=86400). Major receivers deliver daily, typically 04:00-09:00 UTC. Smaller receivers vary or send no reports at all. - RUF (forensic) reports —
defined in
RFC 7489 §7.3,
addressed by
ruf=— are per-message failure reports including header content. Privacy implications mean most major receivers no longer send RUF. - DMARC Analyzer
ingests aggregate reports via
includes/DmarcParser.php(XML, ZIP, and GZ formats per RFC 7489 §7.2.1.1) and forensic reports viaincludes/ForensicReportParser.php(RFC 6591 ARF envelope).
1. What is a DMARC aggregate report?
A DMARC aggregate report — also
called a RUA report after the
rua= tag in the DMARC record that
publishes the destination address — is an XML
document that a receiving mail provider sends
back to the domain owner once per day,
summarising every message claiming to be from
the domain that the receiver processed during
the reporting window. The format is defined in
RFC 7489 §7.2
and the underlying XSD schema is published in
RFC 7489 Appendix C.
The data model: receivers group every observed
message by source IP and
authentication outcome. Each
group becomes one <record>
element in the report, with a message count
and the underlying SPF / DKIM evaluation
results. The result is a per-day, per-IP
snapshot of every authentication path your
domain was associated with — legitimate or
not. That snapshot is the primary diagnostic
stream for any DMARC deployment.
Aggregate reports are the artefact every DMARC rollout depends on:
- Phase 1 (Discovery) of the rollout — see DMARC policy rollout — uses aggregate reports to inventory every legitimate sender that currently sends mail claiming to be from your domain.
- Phase 2 (Alignment fix-up) uses aggregate reports to verify each remediation landed (a misaligned SaaS sender flips to aligned in the next day's report).
- Phase 3-5 (Enforcement) uses aggregate reports to confirm no unexpected legitimate flows are being blocked.
- Post-rollout steady state keeps aggregate-report monitoring forever as the detection mechanism for newly misaligned senders (new SaaS deployments, new partner integrations).
The mechanism is asymmetric: the receiver knows everything (every message, every SPF / DKIM result, every disposition) but the sender knows only what the receiver chooses to report. Without aggregate reports, the sender is blind. With aggregate reports, the sender has near-complete visibility into the full sending estate — including senders the sender did not know existed.
2. The RUA mechanism: how reports get generated and delivered
- The sender publishes a DMARC TXT record at
_dmarc.example.comwith arua=tag listing one or more report destination URIs (typicallymailto:addresses).rua=mailto:dmarc-reports@example.comis the minimum. - The receiver consumes the DMARC record on
every inbound message claiming the
sender's domain in
From:. For each such message the receiver records the source IP, the SPF / DKIM outcomes, and the disposition applied. - At the end of the reporting interval
(default 86400 seconds, the
ri=tag overrides), the receiver groups the day's observations by source-IP / auth-result combinations and emits one XML report per sender-receiver pair. - The report is gzip-compressed (or
sometimes ZIP-compressed) and emailed as
an attachment to every
mailto:address inrua=. Filename convention:receiver!sender-domain!begin-ts!end-ts.xml.gzwhere the timestamps are Unix epoch seconds. - The sender ingests the XML (typically
via tooling like
includes/DmarcParser.php), decodes the records, and surfaces the per-sender authentication breakdown.
Two RFC-defined nuances matter for the mechanism:
- Cross-domain authorisation
(RFC 7489 §7.1): the rua mailbox
does not have to be on the same domain as
the DMARC-protected sender. To accept
reports for
example.comatreports.aggregator.example, the aggregator must publish a TXT record atexample.com._report._dmarc.aggregator.examplecontainingv=DMARC1. Without the authorisation record, receivers SHOULD NOT send reports across domain boundaries. - Report-size limits (RFC 7489 §7.2.1): receivers MAY truncate oversized reports. A report with thousands of source-IP groups may exceed the receiver's email-attachment size limit, in which case the receiver typically emits the most-active groups and drops the long tail. High-volume senders should expect truncation and plan around it.
3. The aggregate-report XML schema
The keystone reference for this page. RFC 7489 Appendix C defines the full XSD; the table below summarises the elements every parser encounters in real-world reports.
| Element | Parent | Required? | Meaning |
|---|---|---|---|
<feedback> |
(root) | Yes | The XML document root.
Contains one
report_metadata, one
policy_published, and
one or more record
children. |
<report_metadata> |
feedback |
Yes | Receiver identity and reporting window. |
<org_name> |
report_metadata |
Yes | Human-readable name of the reporting organisation (e.g. "google.com", "Yahoo"). |
<email> |
report_metadata |
Yes | Contact email at the reporting organisation. |
<report_id> |
report_metadata |
Yes | Unique identifier per receiver per report. Used for deduplication on the sender side. |
<date_range> |
report_metadata |
Yes | Two children
(begin and
end) carrying Unix
epoch timestamps that bound the
reporting window. |
<extra_contact_info> |
report_metadata |
No | Optional URI for additional receiver contact information. |
<policy_published> |
feedback |
Yes | The DMARC record as the receiver
saw it during the reporting
window. Children mirror the DMARC
tags: domain,
adkim,
aspf,
p, sp,
pct,
fo. |
<record> |
feedback |
Yes (1+) | One per source-IP /
authentication-result combination.
Contains row,
identifiers,
auth_results. |
<row> |
record |
Yes | The source IP
(source_ip), the
message count
(count), and the
policy_evaluated
block (disposition + dkim/spf
alignment outcome). |
<policy_evaluated> |
row |
Yes | The DMARC outcome. Children:
disposition
(none /
quarantine /
reject),
dkim
(pass /
fail),
spf
(pass /
fail). |
<identifiers> |
record |
Yes | The domains involved.
header_from is the
From: header domain;
envelope_from and
envelope_to are
the SMTP-level addresses. |
<auth_results> |
record |
Yes | The underlying SPF / DKIM
results before alignment is
applied. Zero or more
dkim blocks (each
with domain,
selector,
result) and one
spf block (with
domain and
result). |
The XML root is <feedback>
rather than the more obvious
<report> for historical
reasons — DMARC reports were originally
modelled on RFC 5965 Abuse Reporting Format
(ARF), which uses feedback-type
in its email-headers form. The aggregate-
report XML kept the feedback
root.
4. A worked aggregate-report example
A minimal aggregate report from Google for
the sending domain example.com
during a 24-hour window:
<?xml version="1.0" encoding="UTF-8"?>
<feedback>
<report_metadata>
<org_name>google.com</org_name>
<email>noreply-dmarc-support@google.com</email>
<extra_contact_info>https://support.google.com/a/answer/2466580</extra_contact_info>
<report_id>12345678901234567890</report_id>
<date_range>
<begin>1716163200</begin>
<end>1716249600</end>
</date_range>
</report_metadata>
<policy_published>
<domain>example.com</domain>
<adkim>r</adkim>
<aspf>r</aspf>
<p>quarantine</p>
<sp>quarantine</sp>
<pct>100</pct>
</policy_published>
<record>
<row>
<source_ip>209.85.220.41</source_ip>
<count>1547</count>
<policy_evaluated>
<disposition>none</disposition>
<dkim>pass</dkim>
<spf>pass</spf>
</policy_evaluated>
</row>
<identifiers>
<header_from>example.com</header_from>
<envelope_from>bounce.example.com</envelope_from>
</identifiers>
<auth_results>
<dkim>
<domain>example.com</domain>
<selector>mail</selector>
<result>pass</result>
</dkim>
<spf>
<domain>bounce.example.com</domain>
<result>pass</result>
</spf>
</auth_results>
</record>
<record>
<row>
<source_ip>192.0.2.200</source_ip>
<count>23</count>
<policy_evaluated>
<disposition>quarantine</disposition>
<dkim>fail</dkim>
<spf>fail</spf>
</policy_evaluated>
</row>
<identifiers>
<header_from>example.com</header_from>
</identifiers>
<auth_results>
<spf>
<domain>attacker.example</domain>
<result>none</result>
</spf>
</auth_results>
</record>
</feedback>
Reading the report:
- The reporter is
Google (
org_name), the window covers 2024-05-20 00:00 UTC to 2024-05-21 00:00 UTC (date_rangein Unix epoch), and the published DMARC record at the time wasv=DMARC1; p=quarantine; sp=quarantine; adkim=r; aspf=r; pct=100. - Record 1 covers 1,547
messages from
209.85.220.41. Both DKIM and SPF aligned and passed — legitimate mail through a properly- configured custom-bounce domain (bounce.example.com) and custom DKIM (selectormail). Disposition isnone(delivered normally) because DMARC passed. - Record 2 covers 23
messages from
192.0.2.200claiming to be fromexample.com. SPF produced no result (result=noneforattacker.example— the wrong domain), no DKIM signature was present, alignment failed for both, and the receiver quarantined per the publishedp=quarantinepolicy. This is the spoofing-attempt signal the rollout is designed to surface.
The count field is critical —
it is the per-day message count for that
source-IP / auth-result combination. A
legitimate sender shows up as one record
with a high count; a spoofing source
shows up as one record with a low count
(or as several records with low counts
from a botnet).
5. Report cadence and delivery
Aggregate reports are delivered as
email attachments
to every mailto: address in the
DMARC record's rua= tag. The
attachment is compressed XML — typically
.xml.gz from major receivers,
occasionally .zip from smaller
receivers.
Filename convention
receiver-domain!sender-domain!begin-timestamp!end-timestamp!unique-id.xml.gz
Example:
google.com!example.com!1716163200!1716249600.xml.gz
The exclamation-mark-separated fields encode the receiver, the sender domain, the reporting-window epoch timestamps, and an optional unique identifier. Not every receiver includes the unique-id suffix.
Reporting interval
The default interval is
86400 seconds (one report
per sender-receiver pair per day). RFC 7489
§6.6.5 defines the ri= tag for
requesting different intervals
(ri=3600 for hourly), but most
receivers honour only the default and
ignore custom ri= values.
Delivery timing
Major receivers deliver reports at consistent times. Typical schedule:
- Google — daily, 04:00-06:00 UTC.
- Microsoft / Outlook — daily, 06:00-08:00 UTC.
- Yahoo — daily, 07:00-09:00 UTC.
- Comcast, AOL, Mail.ru — daily, varies.
A new DMARC record takes one full reporting interval to surface in aggregate reports — receivers cached the old record for the TTL duration plus the reporting-interval window. Expect 24-48 hours after publishing or changing a record before the next report reflects the change.
6. Reading aggregate reports operationally
Aggregate reports are dense, repetitive,
and tedious to read by hand — a typical
daily report from a single major receiver
is several hundred lines of XML covering
a dozen source-IP groups. Tooling is
essential. DMARC Analyzer's ingestion
pipeline at includes/DmarcParser.php
parses XML, ZIP, and GZ formats, deduplicates
by report_id + org_name,
persists per-record rows to the
dmarc_records table, and
surfaces per-sender / per-IP / per-day
aggregations in the dashboard.
The diagnostic questions reports answer:
- Who is sending mail claiming to
be from my domain? Group records
by
auth_results/spf/domainandauth_results/dkim/domain; every distinct domain is a candidate sending source. Legitimate senders use recognised domains (your bounce domain, SaaS DKIM domains you provisioned); unknown domains are either shadow IT or spoofing. - Which legitimate senders are
misaligned? Filter to records
where the source IP belongs to a known
legitimate sender but
policy_evaluated/dkimorpolicy_evaluated/spfisfail. These are your rollout-blocking remediations. - What is the apex pass rate?
Sum
countacross all records where both alignment outcomes arepass; divide by total count. A healthy apex sits at 99%+ aligned; a rollout-ready apex sits at 99.5%+. - What is the current disposition
distribution? Group by
policy_evaluated/disposition. Atp=none, every disposition isnoneby definition; atp=quarantine, you see a mix ofnone(passing mail) andquarantine(failing mail); atp=reject, you seenone+reject. - Are receivers seeing the policy
I published? Check
policy_published/pmatches the intended value. Mismatch indicates a propagation delay or a typo in the DNS record.
7. Forensic (RUF) reports
DMARC defines a second report type — the
forensic or
failure report (also
called RUF after the
ruf= tag). RUF reports are
per-message rather than per-day, triggered
by individual DMARC-failing messages, and
they include header content from the
failing message (From:, To:, Subject,
sometimes a body excerpt).
RUF is specified in
RFC 7489 §7.3
and uses the
RFC 6591 Abuse Reporting
Format (ARF)
envelope rather than the XML schema. A RUF
report is an email message with a multipart
structure: a machine-readable
message/feedback-report part
plus a message/rfc822 part
containing the actual failing message
headers and body (or excerpt).
Privacy implications: RUF reports include actual From: addresses and subject lines from failing messages — which means user PII from every legitimate alignment failure is forwarded to the rua mailbox. Mailing-list forwarding, SaaS sender misconfiguration, and forwarding chains all generate forensic reports that include user data. The privacy posture led the major consumer mailbox providers to stop sending RUF reports entirely:
- Google — never sent RUF.
- Microsoft / Outlook — does not send RUF.
- Yahoo — does not send RUF.
- Comcast, AOL — do not send RUF.
Some smaller receivers and enterprise
gateways still send RUF reports. DMARC
Analyzer ingests them via
includes/ForensicReportParser.php
(RFC 6591 ARF envelope, RFC 7489 §7.3
forensic-content format), persists to
dmarc_forensic_reports, and
surfaces them alongside aggregate-report
data in the dashboard. The fo=
tag in the DMARC record controls forensic
report generation
(fo=0 default,
fo=1 any auth failure,
fo=d DKIM failure,
fo=s SPF failure) but only
influences the receivers that actually
emit RUF.
Practical guidance: publish
ruf=mailto:dmarc-forensic@example.com
if your mail-flow can handle the privacy
implications, but treat any RUF data as a
bonus signal. The major-receiver RUA
stream is sufficient to drive a
rollout; RUF is supplemental, not
primary.
For a deeper dive into RUF including the
full AFRF MIME schema, the
message/feedback-report
key-value fields
(Feedback-Type,
Reported-Domain,
Auth-Failure,
Source-IP,
Original-Mail-From,
Identity-Alignment),
a worked AFRF example, GDPR /
CCPA implications, and operational
reading patterns, see the dedicated
DMARC
forensic (RUF) reports guide.
8. RUA mailbox best practices
- Host the rua mailbox at a
different domain. Reports for
example.comdelivered torua@example.comcreate a chicken-and-egg problem: ifexample.comfails DMARC during rollout, its own reports may fail to deliver. Userua@reports.example-corp.comor a dedicated reports domain. - Disable spam filtering for the rua mailbox. Aggregate reports arrive from dozens of receiver domains with attachments and varied DKIM signatures — exactly the pattern that triggers spam filters. Allowlist or skip spam filtering for the rua mailbox.
- Use a parser, not a human.
Aggregate reports are dense XML — the
diagnostic value comes from per-sender
aggregation across many reports.
Pipe the mailbox into DMARC Analyzer
(
includes/DmarcParser.php) or another reporting tool. - Deduplicate by
report_id+org_name. Receivers occasionally resend reports after delivery failures; without deduplication the same observations are counted twice. - Publish cross-domain
authorisation if needed. If
the rua mailbox is at a different
domain, publish
example.com._report._dmarc.aggregator.examplewithv=DMARC1so receivers will send across domain boundaries (RFC 7489 §7.1). - Retain reports for at least 13 months. Aggregate-report history is the only artefact that documents what the sending estate looked like at a given point in time. Year-on-year comparisons require at least one full year of retained reports plus margin.
- Monitor for missing receivers. If you typically receive daily reports from Google, Microsoft, and Yahoo and one stops arriving, something changed — either at the receiver, in the DNS propagation of your record, or in your rua mailbox delivery path.
- Alert on new spoofing IPs. The same record-pattern (failing DMARC, high count, unfamiliar source IP) is the spoofing signal. Alert on it.
- Treat aggregate reports as confidential. Reports list every IP that sent mail claiming to be from your domain — including internal infrastructure IPs. The report itself does not contain user PII but the IP inventory is sensitive for an attacker mapping your sending infrastructure.
- Never disable RUA after
p=reject. Aggregate-report
monitoring is the detection mechanism
for newly misaligned senders. Drop
rua=and you lose visibility into every future configuration drift.
9. Common aggregate-report mistakes
- Publishing rua= without a plan for the reports. Reports arrive in volume from day one. A mailbox that fills up and bounces means receivers stop sending and you lose the diagnostic stream.
- Hosting the rua mailbox on the same domain DMARC is protecting. Chicken-and-egg delivery problem during rollout. Host at a different domain or publish cross-domain authorisation.
- Treating each report in isolation. A single report from one receiver covers a fraction of total volume — the diagnostic value comes from aggregating across receivers across days. Use tooling.
- Confusing
auth_resultswithpolicy_evaluated. Theauth_resultsblock is the raw SPF / DKIM verdict before alignment is checked; thepolicy_evaluatedblock is the final DMARC outcome after alignment. SPF can pass inauth_resultsand fail inpolicy_evaluatedif the SPF-authorised domain does not align with the From: header. - Setting
ri=too short. The default is 86400 seconds (daily). Lower values are explicitly allowed by RFC 7489 §6.6.5 but most receivers ignore them — and the few that honour them produce far more report email than is operationally useful. - Publishing
rua=at a non-existent mailbox. Receivers attempt delivery, bounce, and may stop retrying. A non-existent rua destination is silently zero reports. - Forgetting to deduplicate.
Some receivers resend reports after
transient delivery failures. Without
report_id+org_namededuplication, a resent report is double-counted. - Treating RUF as primary. RUF reports are sparse (major receivers don't send them) and carry user-PII privacy risk. The diagnostic-stream commitment is RUA; treat RUF as a bonus.
- Disabling rua after
rollout. Aggregate-report
monitoring is the post-rollout
detection mechanism. Drop
rua=and a new misaligned sender is invisible until it produces a support ticket. - Mistaking spoofing volume for a problem to fix. A report showing 10,000 DMARC-failing messages from a Russian IP block is not a misalignment — it is the spoofing being blocked by your DMARC record. The win is that the receiver applied the policy.
10. Aggregate-report troubleshooting
- Reports are not arriving at the rua mailbox
- Verify the mailbox accepts mail and is
not over-quota. Test by sending a
message from a different domain. If
the rua mailbox is on the same
DMARC-protected domain, publish
cross-domain authorisation at
example.com._report._dmarc.aggregator.exampleor move the mailbox to a separate domain. Confirm the DMARC record has propagated — receivers typically need 24-48 hours after a record change before reports reflect the new configuration. - Reports are arriving but the parser rejects the XML
- Some receivers produce malformed XML
(missing required elements, encoding
glitches, broken gzip streams). A
robust parser (such as
includes/DmarcParser.php) handles common defects: optional elements, both draft and RFC 7489 formats, and disables external entity loading for XXE defence-in-depth. Inspect the raw attachment in a text editor before assuming a parser bug. - The report shows unfamiliar source IPs
- The full list: legitimate senders you
forgot, SaaS senders sending without
custom-domain DKIM, partners forwarding
mail (envelope-rewrite from the
forwarder's IP), and spoofing sources.
Look up each unfamiliar IP using
reverse DNS (
dig -x) and WHOIS. Legitimate SaaS senders resolve to recognisable provider names (SendGrid, Mailgun, Marketo); spoofing sources typically resolve to consumer-ISP or hosting-provider ranges. - Disposition is none even though p=reject is published
- Check
policy_published/pin the report — if it showsnone, the receiver was still seeing the previous record at the time of the reporting window (TTL propagation delay). If it showsrejectbut disposition isnone, the record passed DMARC and the receiver delivered normally (thenonedisposition is the DMARC-passing-mail label, not thep=nonepolicy label). - Volume is dropping week over week
- Usually benign — a legitimate seasonal cycle, a one-off marketing campaign that ended, or a SaaS sender that was retired. Compare against historical baselines (the 13-month retention recommendation exists for exactly this purpose). A sharp drop across all senders may indicate an outbound mail-flow problem.
- The report references a domain I do not own
- If
policy_published/domainis a domain you do not control, something is wrong with your DMARC record publication. Check that the TXT record at_dmarc.your-domainis actually serving the intended content usingdomain_checker.phpordig +short TXT _dmarc.your-domain. - Reports stopped from one receiver
- If a specific major receiver stops sending reports, the receiver may have observed a delivery failure to the rua mailbox and stopped retrying. Some receivers re-enable after a quiet period; others require a manual unblock request through the receiver's postmaster interface.
11. Frequently Asked Questions
- What is a DMARC aggregate report?
- A DMARC aggregate report (also called
a RUA report, from the
rua=tag that publishes the destination address) is an XML document that a receiving mail provider sends back to the domain owner once per day. It summarises every message claiming to be from the domain that the receiver processed during the reporting window, grouped by sending IP, with per-group SPF / DKIM authentication results, alignment outcome, and the disposition the receiver applied. RFC 7489 §7.2 defines the format. Aggregate reports are the primary diagnostic stream for any DMARC deployment. - What is the difference between RUA and RUF reports?
- RUA reports (aggregate) are daily
XML summaries describing message
volumes and authentication outcomes
per sending IP — defined in RFC 7489
§7.2, addressed via the
rua=tag in the DMARC record. RUF reports (forensic, or failure reports) are per-message reports describing individual DMARC-failing messages, including header content — defined in RFC 7489 §7.3, addressed via theruf=tag. RUF reports include sensitive content (the From: header, subject line, sometimes the message body) and have meaningful privacy implications, which is why most major receivers stopped sending RUF entirely. RUA is universal; RUF is patchy at best. - How often are aggregate reports sent?
- The default reporting interval is
86400 seconds (one daily report per
sender-receiver pair). The
ri=tag in the DMARC record allows a domain owner to request a different interval (e.g.ri=3600for hourly), but most receivers honour only the daily default. Major receivers (Google, Microsoft, Yahoo, Comcast, AOL, Mail.ru) send reports daily at consistent times, typically between 04:00 and 09:00 UTC. Smaller receivers may send less frequently or not at all. - How are aggregate reports delivered?
- Reports are delivered as email
attachments to the mailbox(es)
listed in the
rua=tag. The attachment is a gzip-compressed XML file (.xml.gz) — or sometimes a ZIP-compressed XML — named by convention:receiver!sender-domain!begin-timestamp!end-timestamp.xml.gz. The email itself follows RFC 5322 with a body referencing the attached report. Domain owners parse the XML using tooling like DMARC Analyzer's ingestion pipeline atincludes/DmarcParser.php(RFC 7489 §7.2.1.1 specifies the email-attachment delivery mechanism). - What are the main elements of the aggregate report XML?
- A DMARC aggregate report has three
top-level child elements under the
root
<feedback>:<report_metadata>(the receiver organisation name, the report_id, the date_range begin/end timestamps, optional extra_contact_info),<policy_published>(the DMARC record as the receiver saw it during the reporting window — domain, adkim, aspf, p, sp, pct, fo), and one or more<record>elements (one per source-IP / authentication-outcome combination). Each<record>contains a<row>(source_ip, count, policy_evaluated/ disposition + dkim/spf evaluation), an<identifiers>block (header_from, envelope_from, envelope_to), and an<auth_results>block (the underlying SPF and DKIM results). - Why are aggregate reports not arriving at my rua mailbox?
- Most common causes: (1) The
rua=mailbox is on the same domain that DMARC protects and the mailbox itself fails DMARC — receivers reject reports they cannot deliver, creating a chicken-and-egg loop. Host the rua mailbox at a different domain, or publish a cross-domain authorisation TXT record per RFC 7489 §7.1 atyour-domain._report._dmarc.rua-mailbox-domain. (2) The mailbox mail-flow is filtering reports as spam — DMARC report mail comes from many varied receiver domains with attachments, which spam filters often flag. Allowlist or unfilter therua=mailbox. (3) A new DMARC record hasn't propagated to receivers yet — receivers cache DMARC records for the duration of the TTL, so changes take up to TTL seconds plus one reporting interval (typically 24-48 hours) to surface in reports. - Do all receivers send DMARC aggregate reports?
- No. The major consumer-mailbox providers (Google, Microsoft / Outlook, Yahoo, AOL, Comcast, Mail.ru, Tencent QQ, Rambler) reliably send aggregate reports. Smaller corporate gateways and ISP mailers vary — many enforce DMARC at delivery time without ever sending reports back. RFC 7489 §7.2 specifies SHOULD-strength language for report generation rather than MUST, and receivers exercise that discretion. The major-receiver coverage is sufficient to power a useful rollout (those receivers handle the vast majority of consumer mail volume) but expect gaps for B2B and niche-receiver traffic.
13. Ingest your aggregate reports now
DMARC Analyzer's ingestion pipeline at
includes/DmarcParser.php
parses aggregate-report XML, ZIP, and GZ
formats (RFC 7489 §7.2.1.1), deduplicates
by report_id +
org_name, persists per-record
rows to the dmarc_records
table, and surfaces per-sender /
per-IP / per-day aggregations in the
dashboard. Forensic (RUF) reports flow
through
includes/ForensicReportParser.php
(RFC 6591 ARF envelope) into
dmarc_forensic_reports.