DMARC Forensic (RUF) Reports Explained: AFRF Schema, fo= Tag, Privacy, and Receiver Coverage (RFC 7489 §7.3, RFC 6591)
A practitioner reference for DMARC forensic (RUF) reports: the per-message MIME stream receivers send when a specific message fails DMARC. Covers the AFRF envelope (RFC 6591), the message/feedback-report schema, the fo= failure-reporting-options tag, a worked example, the major-receiver coverage reality (most do not send RUF), the GDPR / CCPA privacy implications, and how DMARC Analyzer ingests reports via includes/ForensicReportParser.php.
This reference is provided in English. DMARC forensic reports are specified in English-language RFCs (RFC 7489 §7.3 + RFC 6591 + RFC 5965) and the canonical AFRF field names (Feedback-Type, Reported-Domain, Auth-Failure, Source-IP, Original-Mail-From, DKIM-Domain, DKIM-Selector, Identity-Alignment, Delivery-Result) are MIME identifiers that do not translate. We keep the body in the source language so technical terms remain consistent with the specifications.
TL;DR
- DMARC forensic reports
(also called RUF reports
after the
ruf=tag, or failure reports) are per-message reports a receiver sends back to a domain owner whenever an individual message fails DMARC. Defined in RFC 7489 §7.3. - Unlike aggregate (RUA) reports — daily statistical summaries with no message content — forensic reports include the failing message's headers (From, To, Subject), sometimes the body, and structured fields naming the authentication failure mode.
- The envelope is the
Authentication Failure Reporting
Format (AFRF) defined in
RFC 6591
— a
multipart/reportMIME message withreport-type=feedback-reportcarrying three parts: human-readable description, machine-readablemessage/feedback-reportkey-value block, and the original failing message (or its headers). - The
fo=tag (failure-reporting options, RFC 7489 §6.6.4) controls WHEN reports are emitted:fo=0on full DMARC failure,fo=1on partial failure (recommended for active rollouts),fo=don DKIM failure,fo=son SPF failure. - Major receiver coverage is poor: Google has never sent RUF, Microsoft / Outlook does not send RUF, Yahoo stopped years ago. Mostly small corporate gateways and a handful of niche ISPs still emit forensic reports.
- Privacy / GDPR: forensic
reports include personal data belonging to
email recipients who never consented to
forwarding. Most receivers stopped sending
RUF specifically because of GDPR Article 5
/ CCPA data-minimisation concerns. Treat
the
ruf=mailbox as a restricted-access security inbox. - DMARC Analyzer ingests
RUF via
includes/ForensicReportParser.php(RFC 6591 AFRF envelope, with auto- detection for MIME multipart, plain feedback-report, and the arf+xml variant). Records persist todmarc_forensic_reports.
1. What is a DMARC forensic report?
A DMARC forensic report — also
called a RUF report after the
ruf= tag in the DMARC record that
publishes the destination address, or a
failure report — is a
per-message report a receiving mail provider
sends back to the domain owner whenever a
specific inbound message fails DMARC. The
format is defined in
RFC 7489 §7.3
and the underlying envelope (Authentication
Failure Reporting Format, AFRF) is defined in
RFC 6591,
which itself extends the older Abuse Reporting
Format defined in
RFC 5965.
The data model is fundamentally different from the aggregate-report sibling:
- Granularity: per message (not per-day-grouped). One failing message produces one forensic report.
- Payload: the original
failing message's headers
(
From:,To:,Subject:, allReceived:chain), often the full message body, and a structured key-value block (Feedback-Type, Reported-Domain, Auth-Failure, Source-IP, Original-Mail-From, DKIM-Domain, DKIM-Selector). - Cadence: triggered the moment the receiver processes a failing message — typically delivered within minutes rather than the daily 24-hour batch cadence of RUA.
- Volume: zero (most receivers do not send RUF) to a steady trickle (smaller corporate gateways) to very rarely a flood (a misconfigured sender producing many failures).
Operators publish ruf= for two
legitimate reasons:
- Deep-dive diagnostics —
when an aggregate-report record shows a
cluster of failures from an unexpected IP
and the operator needs the per-message
headers to identify the sender (the
aggregate report only carries the source
IP, not the
Received:chain or theSubject:). - Active phishing investigation — when an operator suspects an active spoofing campaign and needs immediate per-message visibility rather than waiting for the next daily aggregate report.
For everyday rollout monitoring, aggregate reports (see DMARC aggregate reports) are the primary diagnostic stream. Forensic reports are a targeted supplement, not a replacement.
2. The RUF mechanism: how forensic reports get generated and delivered
- The sender publishes a DMARC TXT record at
_dmarc.example.comwith aruf=tag listing one or more report destination URIs (typicallymailto:addresses).ruf=mailto:dmarc-forensic@example.comis the minimum. - The sender optionally publishes a
fo=tag to scope which failures trigger a report. The defaultfo=0fires only when both SPF and DKIM fail to produce an aligned pass —fo=1fires on either failure (recommended for active rollouts; see Section 5 below). - The receiver consumes the DMARC record on
every inbound message claiming the
sender's domain in
From:. For each such message the receiver evaluates SPF, DKIM, and alignment. - If the message fails per the published
fo=options, the receiver constructs an AFRF MIME message: amultipart/reportenvelope containing the human-readable description, the machine-readablemessage/feedback-reportkey-value block, and the original failing message (or its headers). - The receiver emails the AFRF message to
every
mailto:address inruf=. Delivery is typically within minutes of the failing message arriving — there is no daily batching as in RUA. - The sender ingests the AFRF message
(typically via tooling like
includes/ForensicReportParser.php), parses the multipart envelope, persists the structured fields, and surfaces the per-message forensic record in the dashboard.
Two RFC-defined nuances matter for the forensic mechanism:
- Cross-domain authorisation
(RFC 7489 §7.1): just as for
aggregate reports, the
ruf=mailbox does not have to be on the same domain as the DMARC-protected sender. The receiver checks for aexample.com._report._dmarc.aggregator.exampleauthorisation record before sending cross-domain. Without it, receivers SHOULD NOT send reports across domain boundaries. - Sampling
(RFC 7489 §7.3): receivers MAY
sample forensic reports rather than
emitting one per failing message — for
example, sending a forensic report for
only one out of every N failing messages
from the same source IP. Sampling is
implementation-defined; do not depend on
a 1:1 message-to-report ratio when sizing
the
ruf=mailbox.
3. The AFRF MIME and feedback-report schema
The keystone reference for this page. RFC 6591
extends RFC 5965 to define the
feedback-report part used by DMARC forensic
reports. An AFRF message is a
multipart/report MIME message
with report-type=feedback-report
containing three parts in order.
MIME envelope structure
| Part | Content-Type | Required? | Meaning |
|---|---|---|---|
| 1 | text/plain |
Yes | Human-readable description of the failure. Free-form text naming the failing authentication mechanism. Not machine-parsed. |
| 2 | message/feedback-report |
Yes | The structured key-value block. Defined by RFC 6591 §3.1. The table below documents every DMARC-relevant field. |
| 3 | message/rfc822
or
message/rfc822-headers |
Yes | The original failing message (full RFC 5322 message including body) or the failing message's headers only. Some receivers redact the body and send only headers to limit data exposure. |
The feedback-report part — key-value fields
The message/feedback-report part
is the structured payload every parser
extracts. Fields are
Key: Value pairs in RFC 5322
header style.
| Field | Required? | Meaning |
|---|---|---|
Feedback-Type |
Yes | Always auth-failure
for DMARC forensic reports
(RFC 6591). Other ARF use cases
(abuse,
fraud) reuse the
same envelope. |
Version |
Yes | AFRF version. Typically
1. |
User-Agent |
Yes | Identifies the reporting software. Helps the recipient attribute the report to a specific receiver implementation. |
Original-Mail-From |
Yes | The SMTP envelope From: of the
failing message
(MAIL FROM). Often
differs from the
From: header. |
Original-Rcpt-To |
Recommended | The SMTP envelope recipient
(RCPT TO) — the
receiver's user. |
Arrival-Date |
Yes | RFC 5322 date stamp identifying when the receiver processed the failing message. |
Source-IP |
Yes | The IP address the failing message arrived from. This is the canonical key for grouping forensic reports by sending source. |
Reported-Domain |
Yes | The domain claimed in the
failing message's
From: header —
i.e. the domain whose DMARC
policy triggered the report. |
Reported-URI |
No | Optional URI identifying a specific resource related to the failure (rarely used). |
Auth-Failure |
Yes | The reason for the failure.
Defined values
(RFC 7489 §7.3 + RFC 6591):
dmarc (DMARC
evaluation failed),
spf (SPF failure
independent of DMARC),
dkim (DKIM
failure),
bodyhash (DKIM
body hash mismatch),
revoked (DKIM key
revoked). |
DKIM-Domain |
Conditional | The signing domain
(d=) of any DKIM
signature that failed.
Multiple values possible if
multiple signatures were
attempted. |
DKIM-Selector |
Conditional | The selector
(s=) of the
failed DKIM signature. |
DKIM-Identity |
Conditional | The i= identity
value from the DKIM signature,
if present. |
Identity-Alignment |
Recommended | Names the alignment outcome
that triggered the report:
none,
spf,
dkim, or
spf,dkim. The
fields named here indicate
which identities ALIGNED;
identities NOT named failed
alignment. |
Delivery-Result |
Recommended | What the receiver did with the
failing message:
delivered,
spam,
policy
(quarantine),
reject,
other. Maps loosely
to the aggregate-report
policy_evaluated/disposition
field. |
Authentication-Results |
Recommended | The full
Authentication-Results:
header value the receiver
computed for the failing
message (RFC 8601). |
DMARC Analyzer's parser at
includes/ForensicReportParser.php
handles three input variants of this schema:
- Raw MIME .eml /
.txt — the full
multipart/reportmessage emitted by RFC 6591-compliant receivers. - Plain feedback-report body — a bare key-value block without the surrounding MIME envelope (some legacy receivers emit this).
- XML
arf+xml— a non-standard XML serialisation a small number of providers use instead of the RFC 6591 MIME format. The parser normalises XML field names to the standard MIME field names.
4. A worked forensic-report example
A minimal AFRF forensic report from a smaller
receiver about a spoofing attempt against
example.com:
From: dmarc-forensic@receiver.example
To: dmarc-forensic@example.com
Subject: DMARC failure report for example.com from receiver.example
Date: Sun, 19 May 2026 14:23:11 +0000
MIME-Version: 1.0
Content-Type: multipart/report; report-type=feedback-report;
boundary="----=_NextBoundary_PROD_1716163391"
------=_NextBoundary_PROD_1716163391
Content-Type: text/plain; charset=UTF-8
This is an authentication failure report for an email message received
from 192.0.2.200 on Sun, 19 May 2026 14:23:08 +0000. For more information
about this format please see https://datatracker.ietf.org/doc/html/rfc6591
------=_NextBoundary_PROD_1716163391
Content-Type: message/feedback-report
Feedback-Type: auth-failure
Version: 1
User-Agent: ReceiverFBL/2.4
Original-Mail-From: bounce@attacker.example
Original-Rcpt-To: alice@receiver.example
Arrival-Date: Sun, 19 May 2026 14:23:08 +0000
Source-IP: 192.0.2.200
Reported-Domain: example.com
Auth-Failure: dmarc
DKIM-Domain: attacker.example
DKIM-Selector: default
DKIM-Identity: @attacker.example
Identity-Alignment: none
Delivery-Result: policy
Authentication-Results: receiver.example;
spf=fail smtp.mailfrom=attacker.example;
dkim=fail (signature did not verify) header.d=attacker.example header.s=default;
dmarc=fail action=quarantine header.from=example.com
------=_NextBoundary_PROD_1716163391
Content-Type: message/rfc822-headers
Received: from mta-out.attacker.example (mta-out.attacker.example [192.0.2.200])
by mx.receiver.example with ESMTPS id ABC123
for <alice@receiver.example>; Sun, 19 May 2026 14:23:08 +0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=attacker.example;
s=default; t=1716163388; bh=...; b=...
From: "Example Support" <support@example.com>
To: alice@receiver.example
Subject: Your account requires verification
Date: Sun, 19 May 2026 14:23:08 +0000
Message-ID: <abc-1234@attacker.example>
------=_NextBoundary_PROD_1716163391--
Reading the report:
- The reporter is a smaller
receiver
(
receiver.example) that still emits forensic reports.Source-IP: 192.0.2.200identifies the sending host — cross-reference this against the operator's known legitimate sending IPs. - The claimed sender is
example.com(theReported-Domainand theFrom:header in the original message) but the SMTP envelope From isbounce@attacker.example— the canonical SPF-misalignment signature. - DKIM signed over
attacker.examplewith selectordefault— the DKIM signature is valid for the wrong domain, so DKIM alignment fails too. - Identity-Alignment: none
confirms neither SPF nor DKIM aligned
to
example.com.Delivery-Result: policymeans the receiver applied the published DMARC policy (p=quarantineorp=reject). - The
Subject:— "Your account requires verification" — and theFrom:header confirm the message was a phishing lure. This is the per-message forensic detail aggregate reports cannot provide.
5. The fo= tag — failure-reporting options
The fo= tag in the DMARC record
(defined in
RFC 7489 §6.6.4)
controls WHEN receivers emit forensic
reports. Without an explicit
fo= tag, the default value is
fo=0 — emit reports only when
DMARC evaluation produces a full failure.
| Value | Trigger | Use case |
|---|---|---|
fo=0 |
Both SPF and DKIM fail to produce an aligned pass (i.e. DMARC fails). | Default. Lowest report volume. Useful for active spoofing investigation when you want only true DMARC-failing messages. |
fo=1 |
Either SPF or DKIM fails to produce an aligned pass (even if the other passes and DMARC overall passes). | Recommended for
active rollouts.
Surfaces partial-fail edge
cases (e.g. SPF aligned but
DKIM not, or vice versa) so
operators can identify
misaligned legitimate
senders before flipping
p=quarantine
or p=reject. |
fo=d |
Any DKIM signature fails cryptographic verification, regardless of alignment. | Diagnose DKIM key issues (rotated keys, body-hash mismatches from middleware-modified messages). |
fo=s |
SPF fails to produce a pass, regardless of alignment. | Diagnose SPF issues
(unauthorised senders,
expired
include:
references, lookup-limit
breaches). |
Multiple values can be combined with a colon separator:
fo=d:s # forensic report on any DKIM OR any SPF failure
fo=0:d:s # default DMARC failures + DKIM failures + SPF failures
Recommendation for new
rollouts: publish fo=1
so partial-fail edge cases surface (these are
the exact misalignments a rollout needs to
remediate before enforcement). Switch to
fo=0 after enforcement to scope
reports to active phishing attempts.
Receivers honour fo= on a
best-effort basis — many receivers ignore
the tag entirely and emit reports per their
own internal policy. Do not depend on
fo= for precise filtering.
6. Who still sends DMARC forensic reports?
A clear-eyed assessment of major-receiver coverage in 2026:
| Receiver | RUA (aggregate) | RUF (forensic) | Notes |
|---|---|---|---|
| Google (gmail.com / Google Workspace) | Yes — daily | Never | Google has never sent forensic reports. Cites privacy / GDPR concerns and volume. |
| Microsoft (outlook.com / Microsoft 365) | Yes — daily | No | Microsoft does not send forensic reports. |
| Yahoo (yahoo.com / aol.com) | Yes — daily | No (stopped) | Yahoo sent forensic reports until ~2018, then stopped citing GDPR concerns. |
| Comcast | Yes | No | Aggregate only. |
| Mail.ru | Yes | No | Aggregate only. |
| Tencent (QQ Mail) | Sometimes | No | Aggregate only when sent. |
| LinkedIn (linkedin.com) | Yes | Occasionally | One of the few enterprise receivers that still emits forensic reports. |
| Smaller corporate gateways (Proofpoint, Mimecast, Barracuda customer tenants) | Varies | Sometimes | Some MX gateway products emit forensic reports if the operator opts in. |
| Niche ISPs (.fr / .de regional ISPs) | Varies | Sometimes | A small number still emit forensic reports. |
The practical reality: a
domain that publishes ruf= and
receives 10 GB / day of legitimate mail
through major consumer mailboxes will receive
zero forensic reports from those
receivers. The trickle of reports that does
arrive comes from smaller corporate gateways
and niche ISPs covering a small fraction of
consumer mail volume.
This is the single most common misconception
about DMARC forensic reports: operators
publish ruf= expecting a
per-message firehose, and instead receive a
tiny stream they cannot rely on for
diagnostic purposes.
7. Privacy, GDPR, and CCPA implications
Forensic reports include personal data belonging to email recipients who never consented to having their messages forwarded to the report destination. Specifically:
- The recipient's email address
(
Original-Rcpt-To) — direct personal data under GDPR Article 4 (1). - The sender's email address
(
Original-Mail-From) — direct personal data for any human sender (less so for automated systems). - The subject line — often contains personal context (e.g. "Your account verification", "Order confirmation #12345"), which can be special-category data under GDPR Article 9 if the subject reveals health, political, religious, or other sensitive attributes.
- The full message body (if the receiver does not redact it) — the most sensitive payload, potentially carrying any content the original sender included.
- The full
Received:chain — the routing path through intermediate mail servers, which can identify network infrastructure.
Why most receivers stopped sending RUF: when GDPR took effect in May 2018 most major European and US receivers re-evaluated forensic-report emission. The legal conclusion at most major receivers was that forwarding recipient-PII to third-party domains required a lawful basis under GDPR Article 6 that most domain-owner arrangements did not document. The operational conclusion was that aggregate reports provide sufficient diagnostic value for DMARC rollouts without the privacy exposure, so forensic emission was a net risk with limited benefit. Yahoo's high-profile decision to stop emitting RUF in 2018 set the precedent the industry followed.
If you receive forensic reports, treat the mailbox as restricted-access security data:
- Limit mailbox access to the security / deliverability team only.
- Document a retention limit (e.g. 90 days) and automate purges.
- Do not log report contents in third-party ticketing, observability, or analytics platforms without explicit DPA coverage.
- Restrict sharing of forensic-report artefacts to the minimum necessary personnel.
- If your DPO has not classified the
ruf=mailbox, document its data category and retention before publishing the tag.
For most rollouts, the cleanest legal
posture is to not publish
ruf= at all and rely
exclusively on aggregate reports. The
diagnostic gap is small (aggregate reports
name the source IP, the count, the
auth-results domains, and the disposition);
the legal exposure of forensic reports is
not. Publish ruf= only when
your security team has explicit retention,
access, and processing-basis documentation.
8. Reading forensic reports operationally
Forensic reports are dense, individually information-rich, but sparse in volume — a single forensic report carries more diagnostic signal than a single aggregate- report record, but you receive far fewer of them. The operational reading pattern is fundamentally different from aggregate-report consumption.
DMARC Analyzer's ingestion pipeline at
includes/ForensicReportParser.php
parses the AFRF MIME envelope, extracts the
feedback-report key-value block, persists
structured fields to the
dmarc_forensic_reports table,
deduplicates by
(arrival_date, source_ip,
reported_domain, original_mail_from),
and surfaces per-report drill-downs in the
dashboard.
The diagnostic questions forensic reports answer that aggregate reports cannot:
- What did the spoofed message
actually say? The
Subject:and message body identify whether the attack was a phishing lure, a malware delivery, a business-email-compromise impersonation, or commercial spam abusing the brand. Aggregate reports never carry this content. - What is the full sending
infrastructure? The
Received:chain shows every intermediate hop between the spoofing host and the receiver — useful for identifying compromised relays, botnet infrastructure, or open proxies. - What DKIM signature did the
attacker attempt?
DKIM-Domain+DKIM-Selectoridentify which domain the attacker tried to sign with. A signed message fromattacker.examplewith selectordefaultis the canonical naive-spoof signature; a signature with the protected domain's own selector but a wrong key is the canonical compromised-key signature. - Which legitimate sender is
misaligned? When forensic
reports arrive for a known legitimate
sending IP, the
Identity-Alignmentfield names exactly which mechanism failed alignment — letting you choose between fixing the SPFinclude:chain or fixing the DKIM signing domain.
Operational workflow:
- Aggregate reports surface a suspicious
cluster (e.g. 200 messages from a new
IP with disposition
quarantine). - If forensic reports arrive for that IP,
drill into the per-message
Subject:andReceived:chain to classify the activity (phishing / BEC / commercial spam / misconfigured legit sender). - If forensic reports do not arrive (the majority case), use the Header Analyzer (header_analyzer.php) on any captured sample message, or check the source-IP via blacklist_checker.php to triage from the aggregate-report data alone.
9. ruf= mailbox best practices
- Use a dedicated address.
Forensic-report traffic is small but
irregular — bursts can happen during
active spoofing campaigns. Do not point
ruf=at a shared inbox or a personal mailbox. A dedicateddmarc-forensic@mailbox keeps the surface scoped and auditable. - Restrict access. Only the security / deliverability team should read forensic reports. Apply principle of least privilege and document who has access.
- Automate ingestion.
Use DMARC Analyzer's IMAP fetcher (see
imap_fetch.php+includes/ImapFetcher.php) or the Microsoft Graph fetcher (includes/GraphFetcher.php) to pull reports automatically rather than reading them by hand. - Document retention.
Forensic reports contain personal
data. Apply a documented retention
limit (90 days is typical) and
automate purges. DMARC Analyzer's
dmarc_forensic_reportstable can be pruned byarrival_date. - Host the mailbox on a
DMARC-passing domain. Just
like the
rua=mailbox, theruf=mailbox must itself pass DMARC at the destination — otherwise the receiver may reject the report email and you lose the signal silently. - Use cross-domain
authorisation if the
forensic mailbox is at a different
domain than the DMARC-protected
sender. Publish a TXT record at
protected-domain._report._dmarc.forensic-hostcontainingv=DMARC1. Without it, receivers SHOULD NOT send cross-domain reports. - Start with
fo=1for active rollouts so partial-fail edge cases surface. Tune down tofo=0after the rollout stabilises. - Treat forensic reports as a supplement, not a primary signal. Aggregate reports are the everyday diagnostic stream; forensic reports are the rare targeted deep-dive.
10. Common forensic-report mistakes
- Publishing
ruf=without a documented privacy process. Forensic reports contain recipient PII. Without a documented data-processing basis, retention limit, and access policy, theruf=mailbox is a GDPR / CCPA liability. Most rollouts should NOT publishruf=until this paperwork exists. - Expecting major-receiver coverage. Google, Microsoft, Yahoo do not send forensic reports. Operators who scope their rollout plan around forensic-report availability will be permanently disappointed; aggregate reports must be the primary signal.
- Pointing
ruf=at a high-traffic shared mailbox. Forensic-report bursts during a spoofing campaign can flood a shared inbox. Use a dedicated mailbox with automated ingestion. - Using the same mailbox for
rua=andruf=. Aggregate reports are bulky binary attachments; forensic reports are smaller text MIME messages. Routing both to one mailbox makes triage harder. Keep them separate. - Treating
ruf=as a real-time alert stream. Even receivers that emit forensic reports often batch them with several minutes' delay. They are not a substitute for inline phishing detection. - Forgetting cross-domain
authorisation. If the
ruf=mailbox is at a third-party aggregator, the protected domain must publish the_report._dmarcauthorisation record. Without it, well-behaved receivers silently drop the report. - Mixing
fo=values without understanding the combinatorics.fo=d:semits reports for ALL DKIM failures plus ALL SPF failures, which can be high volume on a domain with many legitimate-but-unaligned senders. Start withfo=1. - Storing forensic-report bodies in third-party observability platforms. Forensic reports contain recipient PII. Logging the body to a SaaS observability vendor without DPA coverage exports the PII outside your data boundary.
11. Forensic-report troubleshooting
- My
ruf=mailbox is empty. Why? - Most likely the major receivers your
mail interacts with do not send
forensic reports — Google, Microsoft,
Yahoo never do. Verify by checking
which receivers your aggregate reports
come from (
report_metadata/org_namein the XML) and consulting Section 6 above. A trickle from smaller corporate gateways is the realistic expectation. - I see a stale daemon-rejection bounce
loop from the
ruf=mailbox. Why? - The
ruf=mailbox is on the same domain that DMARC protects and the mailbox itself fails DMARC — receivers reject reports they cannot deliver, creating a feedback loop. Host theruf=mailbox at a different domain or ensure the mailbox-hosting subdomain has its own DMARC pass. - The forensic-report email arrives but the AFRF parser fails to extract fields.
- Verify the report is actually
Content-Type: multipart/report; report-type=feedback-report. Some receivers emit atext/plainhuman-readable report only, with nomessage/feedback-reportmachine-readable part — these are not RFC-compliant AFRF and the parser cannot extract structured fields. Save the .eml and inspect manually. - I receive forensic reports from a receiver I do not recognise.
- Cross-reference the
From:domain of the report email against the receiver's published DMARC documentation. A report from a domain you cannot authenticate may itself be a phishing lure — do not click links in the report and do not blindly ingest body content. The DMARC Analyzer ingestion pipeline runs XML-external-entity protection on all parsed reports. - The forensic report's
Authentication-Results:header disagrees with the aggregate-reportauth_results. - Aggregate reports summarise the
evaluation OUTCOME the receiver
applied during disposition; forensic
reports include the RAW
Authentication-Results:header at receive time. The two can differ slightly when the receiver's ARC-validation step or DMARC override rules apply between receive-time and disposition. The forensic-report header is the canonical authentication answer at receive time. - I want to receive forensic reports but only for true spoofing, not for misaligned legitimate senders.
- Publish
fo=0rather thanfo=1. The defaultfo=0fires only when both SPF and DKIM fail to produce an aligned pass — i.e. real DMARC failures. Misaligned legitimate senders typically produce a partial-fail (one mechanism aligns, the other doesn't) whichfo=0does not trigger on.
12. FAQ
- What is a DMARC forensic report?
- A DMARC forensic report (also called a
RUF report after the
ruf=tag, or a failure report) is a per-message report a receiver sends back to the domain owner whenever a specific message fails DMARC evaluation. Unlike aggregate (RUA) reports — which summarise message volumes statistically once per day — forensic reports are emitted per failing message and contain the failing message's headers, From: address, subject, and sometimes the body. The format is specified in RFC 7489 §7.3 with the underlying envelope defined in RFC 6591 (Authentication Failure Reporting Format, AFRF). Forensic reports are the highest-fidelity signal a domain owner can request, but most major receivers stopped sending them because of the privacy implications. - What is the difference between RUA and RUF reports?
- RUA reports (aggregate, RFC 7489 §7.2) are daily statistical XML summaries describing message volumes and authentication outcomes per sending IP. They contain no message content. RUF reports (forensic, RFC 7489 §7.3) are per-message MIME reports describing individual DMARC-failing messages, including the failing message's headers and sometimes the body. RUA is universally supported by major receivers (Google, Microsoft, Yahoo); RUF is patchy at best because the per-message payload includes user-identifying information (sender + recipient addresses, subject lines, and sometimes message body) that conflicts with GDPR § 5 / CCPA data-minimisation principles. The aggregate-report stream is the everyday rollout signal; the forensic-report stream is the rare diagnostic deep-dive.
- Do major receivers send DMARC forensic reports?
- No. Google has never sent DMARC
forensic (RUF) reports.
Microsoft / Outlook does not send
RUF. Yahoo stopped sending forensic
reports years ago. Comcast, AOL,
Mail.ru, and the major consumer
mailbox providers do not send RUF.
The receivers that still
occasionally send forensic reports
are smaller corporate gateways and
a handful of niche ISPs —
together they cover a small
percentage of consumer mail volume.
Operators who publish
ruf=should expect a trickle of reports, not the firehose RUA delivers. If your priority is rollout monitoring, focus on aggregate reports; if your priority is per-message forensics, publishruf=and accept that coverage is partial. - What does the fo= tag in the DMARC record do?
- The
fo=tag is the failure-reporting-options tag defined in RFC 7489 §6.6.4. It tells receivers WHEN to emit forensic (RUF) reports. Values are:fo=0(default) — emit a forensic report only when BOTH SPF and DKIM fail to produce an aligned pass;fo=1— emit a forensic report when EITHER SPF or DKIM fails to produce an aligned pass (the most useful value for active rollouts because it surfaces partial-fail edge cases);fo=d— emit a forensic report on every DKIM failure regardless of alignment;fo=s— emit a forensic report on every SPF failure regardless of alignment. Multiple values can be combined with a colon, e.g.fo=d:s.fo=1is the recommended starting value for operators who choose to receive forensic reports. - What is the AFRF format and which RFCs define it?
- AFRF stands for Authentication
Failure Reporting Format. It is the
MIME-based envelope that wraps a
DMARC forensic report. The envelope
structure is defined in RFC 6591
(extending the older RFC 5965
Abuse Reporting Format). An AFRF
report is a
multipart/reportMIME message withreport-type=feedback-reportcontaining three parts: (1) a human-readabletext/plaindescription of the failure, (2) a machine-readablemessage/feedback-reportpart with key-value fields likeFeedback-Type,Reported-Domain,Auth-Failure,Source-IP,Original-Mail-From,DKIM-Domain,DKIM-Selector, and (3) amessage/rfc822(ormessage/rfc822-headers) part containing the original failing message or its headers. DMARC Analyzer's ingestion pipeline atincludes/ForensicReportParser.phpparses all three parts and persists the structured fields to thedmarc_forensic_reportstable. - Are DMARC forensic reports a GDPR risk?
- Yes — forensic reports include
personal data (sender address,
recipient address, subject line,
sometimes message body) belonging
to email recipients who never
consented to having their messages
forwarded to the report
destination. Under GDPR Article 5
(data minimisation) and Article 6
(lawful basis), processing those
reports outside the receiver's own
infrastructure requires a
documented purpose, a lawful
basis, and recipient transparency.
Most major European receivers
stopped sending forensic reports
for exactly this reason. Operators
who do receive RUF should: (a)
restrict mailbox access to the
security team only, (b) document
retention limits, (c) avoid
logging report contents in
third-party systems without
explicit DPA coverage, and (d)
prefer aggregate reports for
non-forensic investigations. The
fo=1value is the most defensible because it scopes reports to actual authentication failures rather than every email a receiver processed. - How does DMARC Analyzer ingest forensic reports?
- The ingestion pipeline at
includes/ForensicReportParser.php(RFC 6591 ARF envelope) auto-detects three input formats: raw .eml / .txt MIME messages (multipart/reportwithreport-type=feedback-report), plain feedback-report bodies (key-value pairs), and XML forensic reports (thearf+xmlvariant some providers use). The parser persists structured fields —Feedback-Type,Reported-Domain,Auth-Failure,Source-IP,Original-Mail-From,Reported-URI,DKIM-Domain,DKIM-Selector,Identity-Alignment,Delivery-Result— to thedmarc_forensic_reportstable, deduplicates by report-id, and surfaces per-report drill-downs in the dashboard. Operators can upload .eml files directly via the upload form onindex.phpor auto-ingest from an IMAP / Microsoft Graph mailbox listed in their profile settings.
14. Ingest your forensic reports now
DMARC Analyzer's ingestion pipeline at
includes/ForensicReportParser.php
parses AFRF MIME messages (RFC 6591),
plain feedback-report bodies, and the
arf+xml XML variant.
Structured fields persist to the
dmarc_forensic_reports
table, deduplicated by
(arrival_date, source_ip,
reported_domain,
original_mail_from), and surface
in the dashboard with per-report
drill-downs. Aggregate (RUA) reports
flow through
includes/DmarcParser.php
(RFC 7489 §7.2) into
dmarc_records.