Skip to content
ParsedMail

Email header parser guide

An email header parser reads the raw headers of a message and lays out its route and checks: each Received hop with the delay between them, the SPF, DKIM and DMARC results in Authentication-Results, and identifiers such as Message-ID. Read the Received lines from the bottom up to follow the message from sender to inbox.

Where to find the raw headers

Every mail client hides headers by default. To see them:

  • Gmail. Open the message, click the three dots next to Reply and choose "Show original". Gmail also shows a short summary of SPF, DKIM and DMARC at the top.
  • Outlook on the web and new Outlook. Open the message, use the three dots menu, then "View" and "View message details".
  • Classic Outlook for Windows. Open the message in its own window, then File and Properties. The headers are in the "Internet headers" box.
  • Apple Mail. View, Message, All Headers, or save the message as a .eml file.

Copy everything from the first line down to the first blank line. That block is the header. Paste it into the free email header parser, which lists the hops, delays and authentication results without sending anything to a language model.

How a header is built

A header is a list of Name: value lines. Long values continue on the next line, indented with a space or tab. Two kinds of headers matter for analysis:

  • Headers written by the sender's software: From, To, Subject, Date, Message-ID, Reply-To, MIME-Version. The sender controls them, so they prove nothing on their own. A forged From line looks exactly like a real one.
  • Headers added on the way: Received, Authentication-Results, ARC headers, DKIM-Signature, Return-Path. Each server that handles the message adds its own lines at the top. The ones added by your own provider are the ones you can trust.

That last point explains the reading order. The top of the header is the most recent and most trustworthy, the bottom is the oldest and closest to the sender.

Reading the Received chain from the bottom up

Each server adds one Received line describing the hop it was part of. A typical line:

Received: from mail-out.vendor.example (mail-out.vendor.example [198.51.100.24])
        by mx.yourcompany.example with ESMTPS id 4f9a2c
        for <[email protected]>;
        Tue, 14 Oct 2026 09:12:41 +0000

Read it as: the server by received the message from the server named in the first part, at the given time. Two names appear in the from part. The first is the name the sending server announced about itself. The one in brackets, with the IP address, is what the receiving server actually saw. When they disagree, believe the bracket.

Walk the chain from the bottom line up:

  1. The lowest Received line is the first hop, often inside the sender's own network. Its contents are only as trustworthy as that network.
  2. Follow each hop upward. The by server of one line should be the from server of the line above it.
  3. The first line added by your own provider marks the boundary. Everything above it is your infrastructure. Everything below it is claimed by others.

Internal hops with private addresses (10.x, 172.16.x to 172.31.x, 192.168.x) are normal inside large providers and do not indicate a problem.

Finding the cause of a delayed email

Each Received line has a timestamp. The difference between consecutive lines is the time the message spent on that hop. A header parser does this arithmetic for you and converts time zones, which is where manual reading usually goes wrong.

HopTimestampDelayLikely meaning
Sender internal09:02:10 +0200Not applicableMessage created
Sender outbound07:02:12 +00002 sNormal
Your gateway07:46:30 +000044 minSender queue, greylisting or a retry after a temporary refusal
Your mailbox07:46:33 +00003 sNormal

Things to keep in mind:

  • A long delay usually sits on the hop where one organization hands over to another. Greylisting and temporary refusals cause retries measured in minutes.
  • A negative delay means one server's clock is wrong. It does not mean the message travelled back in time, and it makes delay figures on that hop unreliable.
  • Compare the Date header with the first Received line. A large gap there means the sender's client held the message, for example in an outbox while offline.

Reading SPF, DKIM and DMARC results

Your provider records the outcome of its checks in an Authentication-Results header:

Authentication-Results: mx.yourcompany.example;
       spf=pass smtp.mailfrom=bounces.vendor.example;
       dkim=pass header.d=vendor.example header.s=s1;
       dmarc=pass (p=REJECT) header.from=vendor.example
CheckWhat it verifiesWhat it does not prove
SPFThe sending IP is allowed to send for the envelope sender domain (smtp.mailfrom)Anything about the visible From address
DKIMThe signed headers and body were not changed and the signing domain (header.d) holds the keyThat the signing domain is the one in From
DMARCSPF or DKIM passed and its domain aligns with the visible From domainThat the content is safe or the sender is honest

DMARC is the one that connects the checks to what the reader sees. A message can pass SPF for bounces.mailing-tool.example and still claim to be from your bank. Only DMARC alignment ties the pass to the From domain.

Results you will see: pass, fail, softfail (SPF only, the domain says "probably not allowed"), neutral, none (no record published), temperror and permerror (a DNS problem or a broken record). Forwarded mail often fails SPF because the forwarding server is not in the original sender's record. DKIM normally survives forwarding unless a mailing list changes the subject or body, and ARC headers can carry the original results across such hops.

Only trust Authentication-Results lines added by your own provider. A sender can insert a fake line further down the header.

Message-ID and other useful identifiers

  • Message-ID is a unique id the sending software assigns, such as <[email protected]>. It identifies the message across forwards and copies, which makes it the most reliable key for spotting duplicates. Its domain part often reveals the software or service that created the message.
  • In-Reply-To and References list the Message-IDs of earlier messages in a thread. Mail clients use them to group conversations.
  • Return-Path is the envelope sender, where bounces go. It often differs from From when mail is sent through a sending service.
  • Reply-To overrides where replies go. A Reply-To on a different domain than From is a classic sign of invoice fraud.

Message-ID is also how parsing tools avoid working on the same email twice. ParsedMail, for example, treats a second email with the same Message-ID in the same inbox within 30 days as a duplicate. The article on inbound email webhooks explains why that matters for automations.

Common patterns and what they mean

What you seeUsual explanation
spf=fail, dkim=pass, dmarc=passThe message was forwarded. DKIM survived and aligned, so DMARC passes.
spf=pass, dkim=none, dmarc=failSent through a service whose envelope domain differs from From, without a DKIM signature for the From domain.
dkim=fail (body hash did not verify)Something changed the body after signing, often a mailing list footer or a security gateway rewriting links.
spf=temperror or dkim=temperrorA DNS lookup timed out during the check. Usually temporary and not a sign of forgery.
dmarc=fail with p=reject, message still deliveredSome providers deliver to spam or quarantine instead of rejecting, or a local policy overrode the domain policy.
Many internal hops with private addressesNormal inside large mail providers and corporate gateways.

None of these patterns is a verdict on its own. Combine them with the route, the timing and the content before you decide a message is fraudulent.

A quick checklist for a suspicious message

  1. Find the first Received line added by your provider and note the IP address it saw.
  2. Read Authentication-Results from that same provider. Is DMARC pass, and for which domain?
  3. Compare the From domain, the Return-Path domain, the DKIM header.d and the Reply-To domain. Unexplained differences need an explanation.
  4. Check the delays. A message that claims to be urgent but was written hours before it was sent is worth a second look.
  5. Look at the Message-ID domain. A message claiming to come from a large company with a Message-ID from an unrelated host is unusual.

Header analysis is about routing and authenticity. When you need the content of emails turned into data, such as order numbers, totals or lead details, that is a job for an email parser instead. To parse email headers and authentication results in one step, paste them into the free header tool.

Frequently asked questions

Which Received line is the original sender?

The lowest one is the earliest hop, but it was written by the sender's side and can be forged. The most reliable source IP is the one recorded in the first line added by your own provider.

Why does a legitimate email fail SPF?

Most often because it was forwarded, so the forwarding server sent it and is not listed in the original domain's SPF record. DKIM and DMARC usually still pass in that case.

Can email headers be faked?

Lines written by the sender, including From, Date, Message-ID and lower Received lines, can be faked. Lines added by your own provider, including its Authentication-Results, cannot be changed by the sender.

What does dmarc=fail with p=none mean?

The message failed DMARC, but the domain owner asked receivers to take no action. The provider delivers it normally, possibly with a warning.

Does the header parser tool use AI?

No. The email header parser reads Received, SPF, DKIM and DMARC fields with fixed rules and does not send headers to a language model.

More from the blog

See your own email as JSON

Paste one into the demo, describe the fields and look at the result. No account needed.