Mailbox providers send the owner of a DMARC-protected domain aggregate reports: one XML
document per receiver and day, listing every IP address that sent mail under your domain, how many messages
it sent, and whether DKIM, SPF and DMARC held. Drop the reports here and read them decoded – every source
with its own red, orange or green light, every result explained, every field named with its
RFC section.
Reports are read in your browser only and never leave it. There is no upload and no storage;
on its own the page makes exactly one kind of request, for the example report.
The optional DNS check (button) sends only domain names from the report – From, DKIM d=, SPF and
policy domain – to domainsecuritycheck.de, nothing else, and stores nothing.
Drop report files here – .xml, .xml.gz or .zip, several at once.
What the viewer shows
A light per source and per report
Every sending IP address gets green, orange or red from its DMARC pass rate, and the report as a whole from the message-weighted rate – with the number of red and orange sources next to it, so one spoofed message colours its source, not your month.
Why a message passed or failed
Per record the viewer says what actually happened: DKIM valid but signed with the wrong domain, SPF passing for the bounce domain instead of yours, a source without any authentication, a forwarder, a mailing list, a policy override by the receiver.
Both report generations
RFC 9990 reports (namespace dmarc-2.0, with discovery_method, testing, np, generator) and the RFC 7489 format most receivers still send (with pct and the retired override reasons). The format is shown as a badge; values outside the RFC lists are flagged, not silently dropped.
Hardened parsing
An own XML reader that knows no DOCTYPE and no entity declarations, byte-counted decompression for .gz and .zip, and ceilings on size, depth and record count – the attacks RFC 9990 §8.1 warns report processors about cannot reach a browser tab that never expands an entity.
How the traffic light works
The pass rate is the share of messages whose policy_evaluated says DKIM or SPF passed in alignment – the DMARC result as RFC 9989 §5.3.5 defines it. The thresholds are our choice, not an RFC value:
Level
Green
Orange
Red
Source (IP)
pass rate ≥ 98 % and at least one message with aligned DKIM
pass rate 90–98 %, or ≥ 98 % without a single aligned DKIM pass (“SPF only”)
pass rate below 90 %
Report
pass rate ≥ 98 %
90–98 %
below 90 %
“SPF only” is orange because SPF breaks at the first forwarder while an aligned DKIM signature survives it (RFC 9989 §7.4). The SPF column itself is never coloured: sending services with their own bounce domain and forwarders are regularly SPF-unaligned and still pass through DKIM.
The light measures what receivers saw, not how your domain is configured. A correctly configured domain under a spoofing campaign shows red sources on purpose – the source table says whether those IPs are yours.
What the fields mean
Section numbers refer to RFC 9990 unless another document is named. The DMARC reference walks through a complete report line by line.
report_metadata – who sent the report (§3.1.1.3)
org_name, email, extra_contact_info
The reporting organisation and how to reach it.
report_id
Unique per report to the same domain (§3.5.1); the same value usually reappears in the mail subject (optional in §3.5.2) and lets you spot duplicates (§3.5.4).
date_range → begin, end
The reporting period in seconds since 1970, UTC; typically one UTC day starting at 00:00 (§3.1.1.4).
error
Problems the receiver had with your DMARC record, such as an invalid rua or several records at one name (§3.1.5).
generator
Name and version of the reporting software; new in RFC 9990.
policy_published – the record the receiver applied (§3.1.1.5)
domain
The DMARC policy domain whose record was used – for a subdomain without its own record, the organizational domain.
discovery_method
treewalk = found by the RFC 9989 DNS tree walk, psl = found the RFC 7489 way via the Public Suffix List. New in RFC 9990.
p, sp, np
Policy for the domain, its subdomains and its non-existent subdomains (RFC 9989 §4.7). Unset tags carry their default: sp follows p, np follows sp.
adkim, aspf
Alignment mode, r relaxed (organizational domain suffices) or s strict (exact match). Default r.
Organizational domain, tree walk
RFC 9989 §4.6: found by walking up the DNS tree from a domain; psd= tags cut the walk. Relaxed alignment compares organizational domains. The optional DNS check determines it the same way the site’s scan does; receivers still on RFC 7489 use the Public Suffix List and may differ.
fo
Failure-report options (RFC 9991). Default 0.
testing
The value of the t tag: y asks receivers to apply the policy one level lower than published (RFC 9989 §4.7). New in RFC 9990.
pct
RFC 7489 only: the percentage of failing messages to which the policy applied. RFC 9989 removed the tag; receivers on the current standard ignore it.
record → row – one IP, one result combination (§3.1.1.8, §3.1.1.9)
source_ip, count
The connecting IP address and how many messages from it share exactly this combination of results.
policy_evaluated → disposition
What the receiver did: none, quarantine, reject – or pass, new in RFC 9990, for a message that passed under an enforcing policy.
policy_evaluated → dkim, spf
The aligned DMARC results, pass or fail – not the raw check results, which live in auth_results. DMARC passes when at least one of the two is pass.
reason → type, comment
Why the disposition differs from your policy (§3.1.6): local_policy, mailing_list, trusted_forwarder, policy_test_mode (your t=y), other; RFC 7489 also had forwarded and sampled_out (from pct).
identifiers – the domains the checks were made against (§3.1.1.10)
header_from
The domain in the From header – the one DMARC protects and aligns against.
envelope_from
The MAIL FROM domain SPF was checked against; may be present but empty for bounces with a null reverse-path.
envelope_to
The recipient domain at the receiver.
auth_results – the raw DKIM and SPF checks (§3.1.1.11 to §3.1.1.13)
dkim → domain, selector, result, human_result
One entry per verified signature: the d= and s= of the signature, the result per RFC 8601 §2.7.1 (pass, fail, neutral, policy, temperror, permerror, none) and free text from the receiver. RFC 9990 makes the selector mandatory and asks for at most 100 signatures per row (§3.1.3).
spf → domain, scope, result, human_result
The domain SPF evaluated, its scope (mfrom; RFC 7489 also allowed helo), the result per RFC 8601 §2.7.2 (adds softfail) and free text.
extension and namespaced elements (§3.2)
Extensions may add namespaced elements at the top level or at the end of a record. The viewer counts them and ignores their content; elements without a namespace that the schema does not define are listed under format notes.
Where the reports come from
Receivers send them to the addresses in the rua= tag of your DMARC record, as a mail attachment named receiver!your-domain!begin!end.xml.gz (RFC 9990 §3.5.2). The XML should be gzip-compressed; some large receivers send a ZIP instead, and this page reads both. No rua, no reports: the DMARC generator adds the tag, the domain security check tells you whether yours is set and whether an external report address is authorised.
Forensic (failure) reports – the ruf= tag, RFC 9991 – are a different format and are not read here.