The Authentication-Results Header
RFC 8601 reference — syntax of the header receivers use to record SPF/DKIM/DMARC/iprev results, ptypes and properties, method result codes, and how to read one.
Reference3 min read
Who it is for ESP operators, Senders
Applies to senders on any platform
ContentsOn this page — 7 sections
To see exactly how a receiver judged your authentication, open a message it delivered and read its Authentication-Results: header. This is the fastest way to find out.
RFC 8601 defines the header. A receiving system adds it at the top of the message to record the outcome of the authentication checks it performed (SPF, DKIM, DMARC, iprev, SMTP AUTH and others). Filters and mail clients (MUAs) later in the path, and people troubleshooting, can then use those results without running the checks again.
Syntax
Authentication-Results: <authserv-id> [version];
<method>=<result> [reason="..."] [<ptype>.<property>=<value>] ... ;
<method>=<result> ... ;
- authserv-id identifies the system that performed the checks, typically by a DNS domain (for example,
mx.google.com). It tells you whose verdict you are reading. - Each resinfo clause, separated from the others by semicolons, reports the result of one method. It can include a free-text
reasonand one or moreptype.property=valuepairs that identify what was evaluated. Authentication-Results: example.com; nonemeans the receiver performed no checks.- Several methods can appear in one header, or the receiver can add several headers (one for each method or each hop).
Property types (ptypes)
| ptype | Values drawn from |
|---|---|
smtp |
SMTP protocol commands (for example, smtp.mailfrom, smtp.helo, smtp.auth) |
header |
Message header fields or parts of them (for example, header.d, header.i, header.b, header.from) |
body |
Message body content (no properties are registered at present) |
policy |
Local policy information that adds to or overrides the raw results (for example, policy.iprev) |
Common methods and their result codes
| Method | Result codes | Key properties |
|---|---|---|
spf |
pass, fail, softfail, neutral, none, policy, temperror, permerror | smtp.mailfrom (the domain or full MAIL FROM address checked), smtp.helo |
dkim |
pass, fail, none, neutral, policy, temperror, permerror | header.d (signing domain), header.i (AUID), header.s (selector), header.b (the first bytes of the signature, to tell several signatures apart) |
dmarc (registered by RFC 7489) |
pass, fail, none, temperror, permerror | header.from (the RFC5322.From domain evaluated), often with policy.dmarc comments giving the disposition applied |
iprev |
pass, fail, temperror, permerror | policy.iprev (the client IP address whose reverse DNS was validated) |
auth (SMTP AUTH) |
pass, fail, none, temperror, permerror | smtp.auth (the authenticated identity), smtp.mailfrom |
arc (registered by RFC 8617) |
none, pass, fail | See ARC |
When policy appears as a result, the check completed but local policy suppressed or overrode the normal result.
Reading one: a worked example
Authentication-Results: mx.google.com;
dkim=pass header.i=@example.com header.s=s2048 header.b=Kx4pR2;
spf=pass (google.com: domain of bounce.example.com designates 203.0.113.5
as permitted sender) smtp.mailfrom=news@bounce.example.com;
dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=example.com
Google's MX server checked the message:
- A DKIM signature by
example.com(selectors2048) verified. - SPF passed for the bounce domain
bounce.example.comat IP 203.0.113.5. - DMARC passed for the From: domain
example.com. Its published policy is reject, and the disposition applied was none, which means the message was delivered.
DKIM is aligned, because d= is the same as the From: domain. SPF passes, and bounce.example.com is aligned with example.com under relaxed alignment. Both paths to a DMARC pass succeeded.
Trust and the removal rule
A sender can forge this header easily, so its security depends on careful handling at the trust boundary:
- An MTA that conforms to RFC 8601 MUST delete any instance of the header that claims (through its authserv-id) to have been added inside the receiver's own trust boundary but did not actually come from a trusted internal MTA. Border MTAs remove or rename incoming instances that carry their own authserv-id before they add their genuine one.
- Filters and MUAs should only trust headers whose authserv-id belongs to their own ADMD. Anything else is untrusted data from outside.
- So when you diagnose deliverability, read the topmost Authentication-Results header whose authserv-id matches the final receiving provider. Lower ones may be out of date (from earlier hops) or forged.
Relationship to other headers
Received-SPF:is SPF's own, older header for recording the result at each hop (RFC 7208). In practice, Authentication-Results has replaced it as the single way to report results.ARC-Authentication-Results:reuses exactly this format to record a snapshot of the results at each forwarding hop (see ARC).
Related articles
- SPF
- DKIM
- DMARC
- DMARC aggregate reports, the same results collected across all receivers
Check your own record
The free check reads what your domain publishes in DNS.
In this topic
All 13 in Authentication →