[ Reports & investigation ]

DMARC XML structure: map fields to an investigation

Read the report hierarchy before turning a row into a DNS change.

By the EmailAuth research team

[ Key points ]

  • Read raw authentication, alignment and disposition separately.
On this page

A DMARC aggregate report groups observations into records. Reading only a source IP or a red status discards the policy, identity and reporting context needed to diagnose the row. Work from the outer report inward and preserve the original XML alongside your interpretation.

Establish the report context

Under feedback, report_metadata identifies the reporting organization, report ID and date range. policy_published describes the policy configuration the receiver observed. RFC 9990 requires one policy domain per report, but that report can contain multiple author domains using the policy. Do not assume that policy_published/domain equals every record's header_from.

Inspect the declared namespace and format. The current RFC 9990 schema and older RFC 7489-era reports differ, so record which validation profile you use. If a document does not match the expected format, quarantine it or explicitly mark partial interpretation rather than silently treating malformed data as a clean report. Parse untrusted XML without resolving arbitrary external entities, and bound compressed input and expansion size.

Follow a record through three layers

The row contains source_ip, count and policy_evaluated. The IP is the connecting system seen by that receiver, not automatically your originating application. The count gives the weight of that combination of observations; counting XML records is not counting messages.

The identifiers section supplies header_from and optional envelope information. auth_results contains raw SPF and DKIM outcomes before interpretation for DMARC. policy_evaluated/dkim and policy_evaluated/spf describe the corresponding DMARC alignment evaluation, while disposition describes handling under policy. Retain override reasons rather than reducing the entire record to a single pass/fail label.

Annotate a synthetic row

Suppose header_from is brand.example, count is 25, the MAIL FROM domain is vendor.example and raw SPF passes. DKIM passes with d=brand.example. The SPF identity is unrelated to the author domain, so it does not provide aligned SPF; the exact-domain DKIM signature does provide aligned DKIM. A policy result of spf=fail and dkim=pass is consistent with those facts. DMARC can pass through DKIM despite the SPF-policy failure.

This example is a field-level teaching fixture, not a complete schema-valid XML document or a measured customer result. It illustrates why adding the connecting IP to brand.example's SPF may be irrelevant: SPF was evaluated for vendor.example, and DMARC already had an aligned DKIM path.

Turn the row into an owned investigation

Correlate the IP and identities with authorized sender records, provider evidence and controlled message tests. Assign an owner before declaring an unknown source malicious or changing DNS. Preserve reporting gaps and time boundaries in the incident note.

A useful annotation includes provenance, period, policy domain, author domain, raw results, aligned results, disposition, count and next action. That structure lets another investigator reproduce your reasoning without depending on a dashboard color.

Retain the field map and expected result

A partial synthetic report map uses reporter Fictional Receiver A, report ID field-map-25 and UTC epoch interval 1704067200–1704153600 (1 January 2024 00:00 to 2 January 2024 00:00 UTC). Its policy domain is brand.example with p=reject, aspf=r and adkim=r. The record has source_ip=192.0.2.10, count=25, header_from=brand.example and envelope_from=vendor.example. Raw SPF passes for vendor.example; raw DKIM passes for brand.example with selector billing1. For this current RFC 9990 reporting-profile example, reported policy results are spf=fail, dkim=pass and disposition=pass. Appendix A defines pass for passing DMARC under an enforcing policy; Appendix B illustrates it.

The field comparison describes 25 observations with a passing aligned DKIM path and no aligned SPF path. Disposition is a supplied receiver field, not computed inbox placement. Metadata establishes provenance and period; policy_published supplies historical configuration; identifiers and auth_results supply the comparison inputs. This fixture is a partial field map, not complete XML, and no schema-valid report or live receiver test is claimed.

Complete a row annotation

  • Reporter and interval: preserve the original report ID and UTC start/end times.
  • Weight: use count, not the number of XML rows.
  • Context: record policy domain, header_from and applicable policy.
  • Authentication: record raw SPF domain/result and each DKIM domain/result; compare passing domains for alignment.
  • Outcome: keep alignment results, disposition and override reasons in separate fields.
  • Next action: name the suspected route, evidence still missing and responsible owner before changing DNS.

Distinguish current and legacy dispositions

RFC 9990 Appendix A defines disposition pass as no action for passing DMARC with an enforcing policy. It retains none as no action taken. Older RFC 7489-format reports lack the pass disposition and can report none for a passing message. Check the namespace, reporting profile and aligned results together: none is not universally invalid, but it should not silently stand in for the current-profile pass example. Neither value proves inbox placement.

[ By role ]

What this means for you

Choose your role for practical next steps.

IT / Mail Admin

Read the full hierarchy

Policy context, identities and raw results must stay linked.

Next steps

  1. Preserve original XML.
  2. Validate against the right schema.
  3. Annotate counts and both result layers.

CISO / SecOps

Treat reports as untrusted evidence

A parsed document can contain misleading data or attack the ingestion pipeline.

Next steps

  1. Limit parser and decompression resources.
  2. Restrict report access.
  3. Corroborate consequential conclusions.

Founder / Non-technical

Prioritize business impact

Counts and route ownership make an investigation more useful than a red status alone.

Next steps

  1. Identify critical sending services.
  2. Assign owners to unexplained rows.
  3. Track the decision and its evidence.

[ FAQs ]

Frequently asked questions

Is one XML record one message?

No. Use the row count to determine how many observations the record represents.

Is source_ip always our application server?

No. It is the connecting system seen by the reporting receiver, which may be a relay or forwarder.

Can one report include several From domains?

Yes, when they fall under the single policy domain represented in the report.

Where are raw authentication results?

In auth_results, separately from the DMARC-related policy_evaluated results.

Does disposition prove inbox delivery?

No. It describes reported policy handling, not a complete mailbox-placement outcome.

Should malformed XML be silently repaired?

No. Keep the original and clearly distinguish validated data from any partial recovery.

Why preserve the namespace?

It helps select the correct schema and distinguish current from legacy report formats.

What should happen before DNS changes?

Correlate the row with an authorized sender and identify the actual authentication or alignment defect.

Why can a passing message show pass in one report and none in another?

Current RFC 9990 defines disposition pass for passing DMARC under an enforcing policy. Legacy reports can use none. Preserve the reporting profile and aligned results; neither label establishes inbox placement.

[ Sources ]

Sources

  1. RFC 9990: DMARC Aggregate Reporting

    Sections §3.1.1 · §3.1.2 · §8.1 · §8.2 · Appendix A

  2. RFC 9989: Domain-Based Message Authentication, Reporting, and Conformance

    Sections §4.4 · §4.8

  3. RFC 7489 Appendix C: legacy report schema (obsolete)

[ Glossary ]

Glossary

DKIM
A signature-based mechanism binding selected message content to a signing domain.
SPF
Authorization of a connecting sending IP for the identity defined by the SPF protocol.
DMARC alignment
The required domain relationship between the author domain and a successfully authenticated identifier.
Aggregate report
Period-based XML observations of authentication, identifiers, counts and policy handling.
Disposition
The reported policy-handling result, distinct from raw authentication and mailbox placement.

Enterprise provenance

Why top financial institutions and governments retired their email security dashboards.

Traditional email authentication platforms sell you a dashboard and ask your engineers to do the labour. In high-stakes environments, manual oversight means delayed enforcement, configuration drift and unmonitored shadow domains.

EmailAuth is the agentic email provenance platform. Our agents enforce p=reject, keep third-party senders aligned and move your domains to full RFC 9989 compliance, the new DMARC standard,, with human-in-the-loop auditability.

Governments Large enterprises Tier-1 financial institutions

SaaS · Dedicated tenancy · Air-gapped on-prem · BYOK encryption

Knowledge Base