Skip to content

Cookie settings

Choose which kinds of cookies you allow. You can change your choice at any time via Cookie settings at the bottom of every page. Privacy statement

Necessary

Always on

Needed to log in, keep your cart and remember your choices. These are always on.

Which cookies?
  • weboke_sessie, weboke_klant, weboke_remember: your session and staying logged in
  • weboke_basket: your cart
  • wkBtwIncl: showing prices with or without VAT
  • wok_cookies: your cookie choice, 12 months

Measures which ad leads to a visit or order, so we do not pay for ads that do nothing.

Which cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), up to 90 days
  • OpenAI Ads, ads in ChatGPT
  • wok_aff: which partner referred you to us (affiliate programme), 60 days

4.6

Country and language

Each country has its own site, with prices and VAT for that country.

View

Module 4 · 4.5

English

Reading DMARC reports

Module 4: Deliverability: SPF, DKIM and DMARC in practice · Reading time: 12 minutes

Learning objective: After this lesson, you'll be able to open and read a DMARC aggregate report, work out per row which source it is and why it passes or fails, and decide what to fix, what you can ignore and when you can tighten your policy.

Key concepts: aggregate report (RFC 9990), rua, XML, gzip or zip, report_metadata, policy_published, record, row, source_ip, count, policy_evaluated (disposition, dkim, spf), identifiers (header_from, envelope_from), auth_results, selector, failure report (ruf, RFC 9991), reporting service, privacy

What you'll receive

If you've set an rua address in your DMARC record (lesson 4.4), large recipients such as Google, Microsoft and Yahoo will send you roughly one aggregate report a day. It's an email with an attachment, usually a gzipped XML file with a name like:

receiver.example!example.com!1793923200!1794009599.xml.gz

That means: from recipient receiver.example, about your domain example.com, for the period between the two timestamps (seconds since 1970; here, 6 November 2026, the whole day in UTC).

A report contains no mail content, no subject lines and usually no recipient addresses. For each sending server it contains the number of messages and the outcome of SPF, DKIM and DMARC. That makes it a reliable overview of who is sending mail on behalf of your domain, including sources you'd forgotten about yourself, and fraudsters.

The structure of a report

A report has three parts. Below are the key pieces from the example file for this lesson (dmarc-rapport-1.xml).

1. Who is reporting, and for which period

<report_metadata>
  <org_name>receiver.example</org_name>
  <email>noreply-dmarc@receiver.example</email>
  <report_id>receiver.example-20261106-7f3c2a91</report_id>
  <date_range>
    <begin>1793923200</begin>
    <end>1794009599</end>
  </date_range>
</report_metadata>

2. Which policy the recipient found for your domain

<policy_published>
  <domain>example.com</domain>
  <p>none</p>
  <sp>none</sp>
  <np>none</np>
  <adkim>r</adkim>
  <aspf>r</aspf>
  <testing>n</testing>
</policy_published>

Always check this: if it doesn't match what you think is in your DNS, the recipient read a different (or old) record.

3. Per source: a record

Each record covers one sending IP address with one combination of outcomes:

<record>
  <row>
    <source_ip>198.51.100.40</source_ip>
    <count>1250</count>
    <policy_evaluated>
      <disposition>none</disposition>
      <dkim>fail</dkim>
      <spf>fail</spf>
    </policy_evaluated>
  </row>
  <identifiers>
    <envelope_from>bounce.mailer.example</envelope_from>
    <header_from>example.com</header_from>
  </identifiers>
  <auth_results>
    <dkim>
      <domain>mailer.example</domain>
      <selector>k1</selector>
      <result>pass</result>
    </dkim>
    <spf>
      <domain>bounce.mailer.example</domain>
      <scope>mfrom</scope>
      <result>pass</result>
    </spf>
  </auth_results>
</record>
PartMeaning
source_ipThe IP address of the server that delivered the mail
countHow many messages from this IP had this outcome
policy_evaluatedThe DMARC outcome: did DKIM pass in alignment (dkim), did SPF pass in alignment (spf), and what did the recipient do (disposition: pass, none, quarantine or reject)
header_fromThe domain in the From address
envelope_fromThe domain of the Return-Path
auth_resultsThe raw outcomes of SPF and DKIM, with the domain they applied to, and for DKIM the selector

The key distinction: auth_results versus policy_evaluated

This is the heart of reading a report. In the example above, auth_results shows pass twice: DKIM passed for mailer.example and SPF passed for bounce.mailer.example. Yet policy_evaluated shows fail twice. That's not a contradiction: policy_evaluated only counts a passed check that's aligned with header_from. Neither domain belongs to example.com, so DMARC fails.

Here's how to read each row:

  1. Look at policy_evaluated. Does dkim or spf show pass? Then DMARC passes and this source is fine.
  2. Does everything fail? Check the domains in auth_results. Is it one of your services, passing but for its own domain? Then you need to turn on DKIM with your own domain at that service (lesson 4.3).
  3. Does it also fail in auth_results, or is DKIM missing altogether? Find out whose IP address it is (reverse DNS, lesson 5.1, or a whois lookup). Is it one of your own systems: fix it. Is it unknown and do the numbers look suspicious: it's probably forgery.

Patterns you'll see again and again

PatternWhat it usually isWhat to do
DKIM pass and SPF pass, both for your own domainYour own mail serverNothing
DKIM pass for your domain, SPF fail or softfail, unknown IPForwarded mail: someone is forwarding your mail, DKIM survivedNothing; this is exactly why DKIM matters
DKIM pass for your domain, SPF pass for a different domainA service with its own Return-Path and your DKIMNothing, DMARC passes on DKIM
Both pass, but for a service's own domainA service that signs with its own domainTurn on DKIM with your domain at that service
SPF softfail for your domain, no DKIM, own serverA server or address of yours that's not in your SPF and doesn't signAdd it to SPF and turn on DKIM
SPF fail or softfail, no DKIM, unknown IP, fluctuating countsForgery (spoofing)Ignore; p=quarantine or reject will stop this

Also watch out for IPv6: a server of your own that sometimes sends over IPv6, while your SPF only lists the IPv4 address, will show a softfail on those rows. With a DKIM signature, DMARC still passes, but it's a sign that your SPF is incomplete.

From report to decision

You're ready to tighten your policy (from none to quarantine, then to reject) when:

  • every source that's yours has at least one pass in policy_evaluated;
  • that's been the case for a few weeks, across all major recipients;
  • whatever still fails is only forwarded mail with a valid DKIM signature (which passes anyway) or clear forgery.

If a major source of your own fails, such as the newsletter service with 1250 messages in the example, it's too early. With p=reject, the recipient would reject those 1250 newsletters.

Making reports readable

One report in a text editor is manageable. Twenty a day is not. There are three approaches:

  • A reporting service (there are many, including free options). You put their address in rua and they turn the data into charts and lists. Note: this gives that service insight into which servers send mail on your behalf, and the report address is on their domain (see the authorisation via _report._dmarc in lesson 4.4). Choose a service you trust and that complies with the GDPR.
  • A tool of your own: there are open-source programs that pull reports from a mailbox and turn them into an overview.
  • Reading them yourself with an XML viewer or a browser, for the occasional check.

Failure reports (ruf, RFC 9991) are different: one per failed message, sometimes including parts of the mail. Almost no large recipient sends them, precisely because of privacy. You don't need them to roll out DMARC properly.

In practice: what it looks like

At WebOké, you can enter the report address in the DMARC helper in DirectAdmin or My WebOké (see lesson 4.4), and you choose which mailbox the reports arrive in yourself; a separate address such as dmarc@ with its own folder stops your regular mail from being buried. You read the reports with a reporting service or a tool of your choice. This works the same way with every provider: the report is a standard format.

Summary

  • An aggregate report is a daily XML file (often gzipped) per recipient, with the number of messages and outcomes for each sending IP.
  • auth_results gives the raw SPF and DKIM outcome; policy_evaluated only what passed in alignment. A pass in auth_results can still be a fail in DMARC.
  • You recognise forwarded mail by DKIM pass with SPF fail; forgery by everything failing from an unknown IP.
  • Only tighten your policy once all your own sources have been passing for a few weeks.
  • Failure reports (ruf) are rare and not needed.

Quiz

1. In one row, auth_results shows DKIM pass for mailer.example, while policy_evaluated shows dkim fail. The From domain is example.com. How is that possible?



2. A row from an unknown IP shows DKIM pass for example.com and SPF softfail for example.com. What is this most likely to be?



3. What does <disposition>none</disposition> mean in a row with dkim fail and spf fail, under a policy of p=none?



4. You see your own newsletter service with 1250 messages failing DMARC. What's the right next step?



5. Why do almost no recipients send failure reports (ruf)?



Exercise

Exercise Z4.5: Reading a DMARC report. Open the example file dmarc-rapport-1.xml (an aggregate report about example.com, with fictional data). Answer the questions: which policy did the recipient find, how many messages are in the report in total, how many of those failed DMARC, which row is the newsletter service and what needs to happen there, which row is forwarded mail, which row is most likely forgery, what needs to change in the SPF record according to row 6, which row passes only thanks to DKIM at a service with its own Return-Path, and can the domain now move to p=quarantine? The program checks your answers against a fixed key and explains, for each question, which line of the report gives the answer.

Exercise Z4.5: Reading a DMARC report

File for this exercise: dmarc-rapport-1.xml

Open the example file dmarc-rapport-1.xml and answer the questions. Want to view your own report too? Then (optionally) upload an unpacked .xml report; it will only stay in memory during checking.













Please upload a test file with fake data rather than your real data. The file only stays in memory while it's being checked; we don't store it.

What you enter and what we find isn't stored. Your browser remembers your answers and whether you've passed the exercise. If you're signed in, we only save that you got the exercise (almost) right in My courses; you can delete that there too.

Further reading

The steps in these articles apply to WebOké's control panels; with other providers it works in a similar way.

One moment…

Set up your domains

For each domain, arrange the nameservers, the link to your hosting and who becomes the owner.

Loading your domains…