How to Read Email Headers to Check Who Really Sent a Message

By Michael Goldsmith · Updated September 23, 2026

Every email carries a hidden section called the headers: a record of where it came from, which servers handled it and whether it passed the sender checks. The From line you normally see is easy to fake. The headers are much harder to fake convincingly, which makes them the best way to settle whether a suspicious message is genuine.

How to see the full headers

Mobile apps rarely show headers, so use a computer for this.

The headers that matter

The raw headers can run to dozens of lines. For checking a sender, only a few matter.

Authentication-Results

This line is added by your provider when the message arrives, so the sender cannot write it. It records the result of the SPF, DKIM and DMARC checks explained in our guide to how email works:

Authentication-Results: mx.google.com; dkim=pass header.i=@paypal.com; spf=pass smtp.mailfrom=paypal.com; dmarc=pass (p=REJECT) header.from=paypal.com

What to look for: dmarc=pass with a header.from domain that is really the company's domain. That combination means the message genuinely came from servers the domain owner authorised. A result of fail, or a pass for some unrelated domain, is a strong warning sign.

From, Reply-To and Return-Path

Received

Each server that handles a message adds a Received line at the top. Reading them from the bottom up shows the route from origin to your inbox:

Received: from mx-out-3.example-bank.com (mx-out-3.example-bank.com [203.0.113.25]) by mx.google.com with ESMTPS id ... for <you@gmail.com>; Tue, 22 Sep 2026 14:02:11 -0700 (PDT)

The line added by your own provider (the top one) is the trustworthy one: it records the real address of the server that connected. Lines lower down were written by servers you cannot verify, and a forger can invent them. Check that the connecting server's name belongs to the organisation the email claims to be from.

Message-ID and Date

A Message-ID from a domain unrelated to the sender, or a Date wildly different from when the message arrived, are small clues that something is off. On their own they are not proof.

Two quick examples

Genuine

From: "Example Bank" <alerts@example-bank.com> Authentication-Results: ... dkim=pass header.i=@example-bank.com; spf=pass smtp.mailfrom=bounce.example-bank.com; dmarc=pass header.from=example-bank.com

The visible From domain matches the domain that passed DMARC. This came from the bank's authorised systems.

Forged

From: "Example Bank" <alerts@example-bank.com> Reply-To: examplebank.support@freemail.example Authentication-Results: ... dkim=none; spf=fail smtp.mailfrom=example-bank.com; dmarc=fail (p=REJECT) header.from=example-bank.com

The From line claims the bank, but SPF and DMARC both fail, there is no DKIM signature, and replies would go to a free webmail account. If this reached your inbox at all, report it as phishing.

Limits of header checking

For the everyday warning signs that do not need headers at all, see How to Spot a Phishing Email.