RFC 9991 — DMARC failure reporting

Domain-Based Message Authentication, Reporting, and Conformance (DMARC) Failure Reporting

Status
Proposed Standard
Published
2026
Obsoletes
RFC 7489

RFC 9991 defines DMARC failure reports — the per-message detail requested by the ruf= tag, sometimes called forensic reports. It was split out of RFC 7489 alongside RFC 9989 and RFC 9990.

What a failure report is for

Two jobs, in the RFC’s framing. It helps you “determine the cause of failures that were part of aggregate reports” — an aggregate report tells you that mail failed and roughly from where, while a failure report tells you about one specific message. And it lets a domain owner “quickly identify and address harmful messages involving direct domain abuse”.

The format derives from the Abuse Reporting Format (RFC 6591), which RFC 9991 augments with DMARC-specific fields:

Field
Identity-Alignmentrequired — which mechanisms failed to authenticate an aligned identity, or none
DKIM-Domain, DKIM-Identity, DKIM-Selectorrequired for DKIM failures of an aligned identifier
SPF-DNSrequired for SPF failure of an aligned identifier
Delivery-Resultoptional
DKIM-Canonicalized-Header / -Bodyoptional

Note DKIM-Selector is required here too — the same change RFC 9990 made to aggregate reports. Knowing which selector failed is the difference between an actionable report and a shrug.

Why you will receive almost none of these

This is the part worth knowing before you add ruf= to a record and wait.

A failure report can contain the header fields, and sometimes the entire content, of a real message — which means Personally Identifiable Information belonging to a third party. The RFC is direct about the consequences: the potential disclosure of PII “should be considered when deciding whether to request failure reports as a Domain Owner, or what information to include or redact in failure reports when creating them as a Mail Receiver, or whether to create failure reports at all.”

In practice the major mailbox providers made that last call years ago. You can publish ruf= correctly and receive nothing indefinitely — not because your record is wrong, but because almost nobody generates them.

What it means in practice

Publish rua= and rely on aggregate reports. They come from nearly everyone, they carry no PII, and they answer the questions you actually have.

Add ruf= only if you have somewhere to put reports that may contain other people’s mail, and treat anything that arrives as a bonus. If you do, the fo= tag controls when a report is generated — that one is defined in RFC 9989, not here.

Read it: rfc-editor.org/rfc/rfc9991