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/report MIME message with report-type=feedback-report carrying three parts: human-readable description, machine-readable message/feedback-report key-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=0 on full DMARC failure, fo=1 on partial failure (recommended for active rollouts), fo=d on DKIM failure, fo=s on 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 to dmarc_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:, all Received: 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 the Subject:).
  • 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

  1. The sender publishes a DMARC TXT record at _dmarc.example.com with a ruf= tag listing one or more report destination URIs (typically mailto: addresses). ruf=mailto:dmarc-forensic@example.com is the minimum.
  2. The sender optionally publishes a fo= tag to scope which failures trigger a report. The default fo=0 fires only when both SPF and DKIM fail to produce an aligned pass — fo=1 fires on either failure (recommended for active rollouts; see Section 5 below).
  3. 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.
  4. If the message fails per the published fo= options, the receiver constructs an AFRF MIME message: a multipart/report envelope containing the human-readable description, the machine-readable message/feedback-report key-value block, and the original failing message (or its headers).
  5. The receiver emails the AFRF message to every mailto: address in ruf=. Delivery is typically within minutes of the failing message arriving — there is no daily batching as in RUA.
  6. 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 a example.com._report._dmarc.aggregator.example authorisation 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/report message 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.200 identifies the sending host — cross-reference this against the operator's known legitimate sending IPs.
  • The claimed sender is example.com (the Reported-Domain and the From: header in the original message) but the SMTP envelope From is bounce@attacker.example — the canonical SPF-misalignment signature.
  • DKIM signed over attacker.example with selector default — 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: policy means the receiver applied the published DMARC policy (p=quarantine or p=reject).
  • The Subject: — "Your account requires verification" — and the From: 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-Selector identify which domain the attacker tried to sign with. A signed message from attacker.example with selector default is 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-Alignment field names exactly which mechanism failed alignment — letting you choose between fixing the SPF include: chain or fixing the DKIM signing domain.

Operational workflow:

  1. Aggregate reports surface a suspicious cluster (e.g. 200 messages from a new IP with disposition quarantine).
  2. If forensic reports arrive for that IP, drill into the per-message Subject: and Received: chain to classify the activity (phishing / BEC / commercial spam / misconfigured legit sender).
  3. 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 dedicated dmarc-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_reports table can be pruned by arrival_date.
  • Host the mailbox on a DMARC-passing domain. Just like the rua= mailbox, the ruf= 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-host containing v=DMARC1. Without it, receivers SHOULD NOT send cross-domain reports.
  • Start with fo=1 for active rollouts so partial-fail edge cases surface. Tune down to fo=0 after 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, the ruf= mailbox is a GDPR / CCPA liability. Most rollouts should NOT publish ruf= 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= and ruf=. 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._dmarc authorisation record. Without it, well-behaved receivers silently drop the report.
  • Mixing fo= values without understanding the combinatorics. fo=d:s emits reports for ALL DKIM failures plus ALL SPF failures, which can be high volume on a domain with many legitimate-but-unaligned senders. Start with fo=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_name in 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 the ruf= 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 a text/plain human-readable report only, with no message/feedback-report machine-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-report auth_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=0 rather than fo=1. The default fo=0 fires 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) which fo=0 does 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, publish ruf= 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=1 is 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/report MIME message with report-type=feedback-report containing three parts: (1) a human-readable text/plain description of the failure, (2) a machine-readable message/feedback-report part with key-value fields like Feedback-Type, Reported-Domain, Auth-Failure, Source-IP, Original-Mail-From, DKIM-Domain, DKIM-Selector, and (3) a message/rfc822 (or message/rfc822-headers) part containing the original failing message or its headers. DMARC Analyzer's ingestion pipeline at includes/ForensicReportParser.php parses all three parts and persists the structured fields to the dmarc_forensic_reports table.
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=1 value 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/report with report-type=feedback-report), plain feedback-report bodies (key-value pairs), and XML forensic reports (the arf+xml variant 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 the dmarc_forensic_reports table, deduplicates by report-id, and surfaces per-report drill-downs in the dashboard. Operators can upload .eml files directly via the upload form on index.php or 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.

Sign up — Free plan Check my ruf= destination