ValidEmailChecker

Free Email Header Analyzer

Paste raw email headers or drop a .eml file. See authentication results, hop chain, sender ID, and plain-English spoof verdict — free, no paywall.

SPF + DKIM + DMARCHop TimelinePaste Only — Private

Privacy:headers stay in your browser tab. No upload, no server, no database. The only network call is the optional live-DNS lookup, which fetches the sender domain's public SPF/DMARC records.

How it works

1

Paste headers or drop a .eml file

Get the raw headers from your mail client ("show original" in Gmail, "view source" elsewhere), paste them in, or drag the .eml file onto the upload zone. Up to 20 MB. Everything runs in your browser.

2

Read the verdict banner

See an instant plain-English answer at the top: Legitimate, Caution, Suspicious, or Likely Phishing. Below that, every signal that drove the verdict — authentication, sender identity, hop chain, anomalies.

3

Drill into the hop timeline + auth panel

Inspect every server the message touched, with TLS status per hop. See exactly why SPF or DKIM failed if they did. Optionally toggle on the live-DNS comparison to see whether the sender's records changed since the message was sent.

An email header tells you who really sent a message, where it actually came from, every server it touched on the way, and whether it survived authentication along the way. The body is what someone wrote. The header is what the protocol recorded. They don't always agree — that's the whole reason analyzers like this one exist.

This page combines the analyzer (paste headers or drop a `.eml` file at the top) with a full read-through of what each field means, how to recognize a spoof attempt by eye, and how to think about the answers you get. If you arrived because an email looked suspicious, the analyzer above gives you a verdict in seconds. If you want to learn enough to do it yourself, keep reading.

What an email header actually contains

Every email message has two parts: a header block and a body, separated by a single blank line. The header block is plain text, one field per line, formatted as `Field-Name: value`. Most of the famous fields (From, To, Subject, Date) are written by the sender's mail client. Almost everything else is added by mail servers as the message moves through the network.

RFC 5322 (which replaced RFC 2822, which replaced RFC 822) is the spec that defines the format. It's not a complicated spec — fields can fold onto multiple lines if a value gets long, certain field names are reserved, and the order doesn't matter except for `Received:` lines, which servers prepend to the top as they handle the message. That last detail is why `Received:` headers read newest-first when you scroll down a raw email.

The headers most worth knowing:

HeaderWho writes itWhat it tells you
`From:`Sender's mail clientThe displayed sender. Trivially forgeable.
`Reply-To:`Sender (optional)Where replies go. Different from From = often a clue.
`Return-Path:`Receiving serverThe bounce address from the SMTP envelope. Hard to forge.
`Received:`Every server in the chainThe hop trail — most useful header for tracing origin.
`Message-ID:`Originating serverUnique identifier. Domain often matches the actual sender.
`Authentication-Results:`Receiving serverSPF / DKIM / DMARC verdict. The single most important auth field.
`DKIM-Signature:`Sender's outbound MTACryptographic signature over the body and selected headers.
`ARC-*:`ForwardersSeal that lets the final receiver trust the original auth results after relaying.
`X-*` (any)Anyone, anywhereVendor-specific. SpamAssassin, Microsoft Defender, Google all use them.

How to find email headers in your mail client

Every mail client buries this somewhere. Here are the paths for the five clients people search for most. Once you have the raw text, paste it into the box at the top of this page.

Gmail (web)

  • Open the message.
  • Click the three-dot menu in the upper-right of the message (next to the Reply arrow).
  • Choose "Show original." A new tab opens with the raw message.
  • Copy everything in the "Original Message" block, or click "Download Original" to grab the `.eml`.

Outlook (Microsoft 365, web + new desktop)

  • Open the message in its own window (double-click it).
  • Go to File → Properties.
  • Scroll to Internet headers — that's the header block. Select all + copy.
  • For the full `.eml` instead: drag the message out of Outlook onto your desktop. That saves it as `.msg` — rename to `.eml` if your tool needs `.eml`, or use the analyzer's paste mode with the visible headers.

Apple Mail (macOS + iPadOS)

  • Open the message.
  • Go to View → Message → All Headers (or press Cmd+Shift+H).
  • Select the now-visible header text and copy. Alternatively View → Message → Raw Source gives you the full `.eml`.

Yahoo Mail (web)

  • Open the message.
  • Click the More menu (three dots).
  • Choose View raw message. Copy everything.

Thunderbird

  • Open the message in its own window.
  • Go to View → Headers → All to show every header inline.
  • For the raw source: View → Message Source (Ctrl+U).

You only need the header block

The blank line that separates headers from body is the natural cutoff. You can copy a few extra body lines by accident — the analyzer ignores them.

Reading the Received: chain (with a worked example)

The `Received:` headers are the most useful field in any message. Each one is stamped by an MTA (mail transfer agent — basically any mail server) as the message arrives. The newest server stamps the topmost `Received:` and the originating server is at the bottom. Read bottom-up to see the chronological path.

A typical line looks like this:

Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com. [209.85.210.175])
        by mx.example.com with ESMTPS id abc123
        for <you@example.com>; Wed, 17 Jan 2024 14:23:01 -0500

Decoded:

  • `from mail-pf1-f175.google.com (...)` — what the previous server claimed to be. The hostname before the parens is the HELO/EHLO it announced. Inside the parens is what the receiving server resolved via reverse-DNS, plus the bracketed IP `[209.85.210.175]`. The receiver-verified parts are trustworthy; the HELO is forgeable.
  • `by mx.example.com` — the server adding this line.
  • `with ESMTPS` — the protocol. `SMTP` is plain text, `ESMTP` is Extended SMTP without TLS, `ESMTPS` adds TLS, `ESMTPSA` adds TLS plus authentication, `HTTP` shows up for webmail-injected mail.
  • `id abc123` — the receiving server's queue ID. Useful when correlating with mail server logs.
  • `for <you@example.com>` — the SMTP envelope recipient (sometimes omitted for privacy).
  • `; Wed, 17 Jan 2024 14:23:01 -0500` — when this server received the message. Compare timestamps across hops to spot delays.

If you see a long gap between two hops (say, 47 minutes), it usually means the next server in line greylisted the message (temporarily refused it on first try to filter spam). Spammers don't retry; legitimate senders do. Greylisting delays are normal.

SPF, DKIM, DMARC — and what failure modes actually mean

The `Authentication-Results:` header is where the receiving server records what happened when it checked the sender's published authentication policies. The three checks most worth understanding:

SPF (Sender Policy Framework)

SPF answers: "Is the IP that just delivered this message allowed to send mail for the return-path domain?" The receiving server takes the return-path domain (the envelope sender, NOT the From: address), looks up its SPF record in DNS, and checks whether the connecting IP is listed. Results:

ResultMeaningWhat to do
`pass`IP is authorized.Nothing — SPF working as intended.
`fail`IP is NOT authorized, and the domain uses `-all` (strict).Treat with skepticism. If you're the sender, run our SPF Syntax Validator to find the missing include.
`softfail`IP is not authorized, but domain uses `~all` (forgiving).Often ends up in spam. Same fix as `fail`.
`neutral`Domain explicitly takes no position (`?all`).Rare and not useful — usually a half-finished SPF setup.
`none`No SPF record published.SPF didn't contribute. Build one with our SPF Record Generator.
`temperror`DNS lookup failed temporarily.Almost always transient. Retry or wait.
`permerror`SPF record is broken (syntax, too many lookups).Run the SPF Syntax Validator — usually a 10-lookup-limit problem.

DKIM (DomainKeys Identified Mail)

DKIM answers: "Was this message cryptographically signed, and does the signature verify?" The sender's MTA signs selected headers and the body with a private key, and publishes the matching public key in DNS at `<selector>._domainkey.<domain>`. The receiver fetches the public key and verifies. If anything in the signed portion changed in transit, the signature fails.

Failure causes, in rough order of frequency:

  • Footer injection — a corporate gateway or mailing-list software added a disclaimer or unsubscribe footer after signing.
  • Body re-encoding — a server along the way converted line endings or character encoding.
  • Public key missing — the selector record was never published, was removed, or has a typo. Check it with our DKIM Record Checker.
  • Signing the wrong headers — the sender included headers in the signature that get rewritten downstream (Subject often).

DMARC (Domain-based Message Authentication, Reporting, and Conformance)

DMARC sits on top of SPF and DKIM. It asks one specific question: "Does the domain in the From: header line up with the domain that SPF and/or DKIM verified?" If at least one of them aligns, DMARC passes. The published DMARC policy (`p=none`, `p=quarantine`, or `p=reject`) tells receivers what to do when DMARC fails.

Three things commonly cause DMARC failure even when SPF/DKIM individually pass:

  • Subdomain alignment — your From: is `marketing.example.com` but you sign with `example.com`. If your DMARC record uses `adkim=s` (strict), this fails. Switch to `adkim=r` (relaxed).
  • Different organizations — your ESP signs with their own domain (sendgrid.net) instead of yours. Most ESPs let you configure custom DKIM — turn it on.
  • Different return-path — your mail goes through a relay that uses its own bounce address. SPF passes for the relay's domain but doesn't align with your From:.

When you receive DMARC reports from receivers, our DMARC Report Analyzer breaks them down per-source. Before publishing a new DMARC record, validate it with our DMARC Record Checker.

ARC — when forwarded mail looks like it failed (but didn't)

ARC stands for Authenticated Received Chain. It exists because forwarding breaks authentication: when a mailing list, .edu alias, or corporate forwarding rule relays a message, the original SPF/DKIM signatures often break (SPF because the relay's IP isn't in the original sender's SPF record; DKIM if the relay modifies the body). DMARC then fails. But the message is legitimate.

ARC fixes this. Each forwarder along the path adds three headers — `ARC-Authentication-Results`, `ARC-Message-Signature`, `ARC-Seal` — sealing what the auth state was when it received the message. The final receiver can validate the chain and choose to honor the original auth results, even though SPF/DKIM technically broke at the relay.

If you see ARC headers in a message and `Authentication-Results` shows DMARC failed, look at the ARC chain. A `cv=pass` seal on the latest ARC instance means a forwarder vouched for the message and the receiver can trust the original sender. ARC adoption isn't universal yet — Google, Microsoft, and Yahoo support it; smaller receivers often don't.

Spotting a spoofed email by reading the headers

Phishing works because most people only read From: and Subject. A few minutes with the headers reveals the most common attacks. Here's a real-style example — what you'd see in a spoof targeting PayPal users:

From: "PayPal Security Team" <noreply@paypal-security.tk>
Reply-To: support-team-29481@gmail.com
Return-Path: <bounce@paypal-security.tk>
Subject: Urgent: Your account has been limited
Authentication-Results: mx.google.com;
        spf=fail (google.com: domain of bounce@paypal-security.tk
            does not designate 185.234.219.77 as permitted sender)
            smtp.mailfrom=bounce@paypal-security.tk;
        dkim=none;
        dmarc=fail (p=NONE sp=NONE dis=NONE)
            header.from=paypal-security.tk

Five red flags in those nine lines:

  • Display name says "PayPal" but domain is `paypal-security.tk` — PayPal's real email comes from `paypal.com` or `paypal.de` etc. The .tk TLD is free, anonymous, and disproportionately used for phishing.
  • Reply-To is a Gmail address — totally inconsistent with a corporate sender. Replying would route your response to the attacker, not to PayPal.
  • Return-Path is on the spoofed domain — meaning bounces go to the attacker, where they'll be ignored.
  • SPF failed — the sending IP isn't in the spoofed domain's SPF record. Spammers rarely bother configuring SPF.
  • DKIM is `none` — no signature, so no cryptographic proof of origin.

Any one of these is suspicious. All five together is definitively a phishing attempt. The analyzer at the top of this page surfaces each of these as a separate flagged finding so you don't have to spot them yourself.

The hardest spoofs to spot

Display-name spoofing with a punycode lookalike domain (`xn--ppal-1aa.com` displays as `pаypal.com` with a Cyrillic 'а'). The visual is identical to the real brand. The analyzer flags these by checking for `xn--` in the From: domain.

Complete header glossary

Every field you'll encounter in a typical message, plus what each piece of a DKIM-Signature actually means.

Address headers

FieldMeaning
`From:`Displayed sender. Forgeable in the message body — DMARC checks alignment against this.
`Sender:`Actual technical sender, if different from From (mailing lists set this).
`To:`, `Cc:`Visible recipients.
`Bcc:`Almost never appears in delivered messages (it's stripped before sending).
`Reply-To:`Where the user-facing client should direct replies.
`Return-Path:`Bounce address from the SMTP envelope. Receiving server writes this — hard to forge.

Identity + tracing

FieldMeaning
`Message-ID:`Globally unique identifier in the form `<random@domain>`. Useful for matching across logs.
`In-Reply-To:`Message-ID this is replying to. Used by clients to thread conversations.
`References:`Full chain of Message-IDs in the conversation.
`Date:`When the message was composed (sender's claim).
`Subject:`Subject line. May be RFC 2047 encoded if non-ASCII (`=?UTF-8?B?...?=`).
`Received:`One per MTA in the path. Read bottom-up for chronological order.

Authentication headers

FieldMeaning
`Authentication-Results:`Receiver's verdict on SPF, DKIM, DMARC, ARC, BIMI.
`Received-SPF:`Legacy single-method version of the above.
`DKIM-Signature:`The actual signature — see breakdown below.
`ARC-Authentication-Results:`Auth results as recorded by a forwarder.
`ARC-Message-Signature:`Forwarder's signature over the message at the time it arrived.
`ARC-Seal:`Forwarder's seal over the ARC chain itself (cv=pass/fail/none).
`BIMI-Selector:`, `BIMI-Indicator:`BIMI logo metadata (Brand Indicators for Message Identification).

Decoding a DKIM-Signature header

DKIM signatures are a soup of `key=value` tags. The important ones:

TagStands forWhat it means
`v=`versionAlways `1` today.
`a=`algorithmSigning algorithm (`rsa-sha256` overwhelmingly).
`c=`canonicalizationHow headers/body get normalized before signing. `relaxed/relaxed` is most common.
`d=`domainThe signing domain. THIS is what DMARC checks alignment against.
`s=`selectorSubdomain label where the public key lives: `<s>._domainkey.<d>`.
`h=`headersColon-separated list of headers covered by the signature.
`bh=`body hashHash of the body. Verifies body integrity.
`b=`signatureThe cryptographic signature itself (base64).
`t=`timestampWhen the signature was created (Unix seconds, optional).
`x=`expirationWhen the signature expires (optional).

List-* headers (mailing lists)

FieldMeaning
`List-Unsubscribe:`URL(s) or mailto: to unsubscribe. Gmail uses this for the one-click button.
`List-Unsubscribe-Post:`POST body for RFC 8058 one-click unsubscribe.
`List-Id:`Mailing list identifier.
`List-Help:`Where to get help with the list.
`List-Archive:`Public archive URL.

X-* headers (vendor-specific)

Anything starting with `X-` is non-standard, added by a specific vendor. A short list of ones the analyzer decodes:

  • `X-Spam-Status`, `X-Spam-Score`, `X-Spam-Flag` — SpamAssassin verdict + numeric score (≥5 = spam by default).
  • `X-Forefront-Antispam-Report` — Microsoft Defender breakdown. Includes `CAT:` (category), `SCL:` (spam confidence 0-9).
  • `X-MS-Exchange-Organization-SCL` — Microsoft Spam Confidence Level (-1 trusted, 0-4 clean, 5-6 likely spam, 7-9 high-confidence spam).
  • `X-Gm-Spam`, `X-Gm-Phishy` — Google's spam/phishing flags.
  • `X-Mailer` — software that composed the message (Outlook, iPhone Mail, Mailchimp, etc.).
  • `X-Originating-IP` — the IP of the user who composed the message, when set.

Privacy — your headers stay in your browser

Email headers carry sensitive information: recipient lists, internal server names, originating IPs, queue IDs, and sometimes user identifiers in `X-` headers. Pasting them into a third-party SaaS analyzer means handing all of that over.

This tool runs entirely in your browser tab. Parsing is JavaScript executing on your machine. The `.eml` file you drop in is read into the browser's memory, not uploaded. There is no network request to our servers when you analyze a message. The only time we touch the network is if you toggle on the optional "compare against live DNS records" feature — and that only fetches the public SPF and DMARC records for the sender's domain via standard DNS-over-HTTPS, which any DNS lookup does.

When you export the analysis as JSON or plain text, the file is generated in your browser and downloaded to your machine via a blob URL. We never see the contents.

Frequently Asked Questions

Questions about reading email headers, finding them in Gmail/Outlook/Apple Mail, spoof detection, and how this differs from MxToolbox and Microsoft MHA.

Every mail client has a "show original" or "view source" command. In Gmail it's under the three-dot menu → "Show original." In Outlook it's File → Properties → Internet headers. In Apple Mail it's View → Message → All Headers. In Yahoo it's More → View raw message. In Thunderbird it's Ctrl+U or View → Message Source. Copy the resulting text and paste it into the box above.

"from" is what the previous server claimed to be (the HELO/EHLO it announced) plus what the receiver verified via reverse-DNS. "by" is the server adding the line. Always trust "by" — that's the receiving server stamping itself. The "from" portion can be partially or fully forged, but the bracketed IP (verified by the TCP connection) is reliable.

Look at three things in priority order. (1) The Authentication-Results header — if DMARC failed, that's a strong negative signal. (2) Whether the display name in From: matches the domain (e.g., "Apple Support" with a `.tk` domain is a tell). (3) Whether Reply-To points to a different domain than From — common BEC pattern. The analyzer above checks all of these and produces a single verdict banner.

Usually only as far as the originating server's IP, which the bottom-most `Received: from` reveals. From there you can identify the ISP, the hosting provider, or the company that owns the IP block — but tying it to an individual requires cooperation from that party (typically a law-enforcement subpoena). Spammers and attackers also routinely use compromised relays, so the IP often belongs to a victim, not the attacker.

It means the sending server's IP isn't listed in the SPF record of the return-path domain, AND that domain published `-all` (strict). The receiving server flagged the message as not authorized. The cause is either a misconfigured legitimate sender (their SPF needs the IP added) or a spoof attempt. If you're the sender, run the [SPF Syntax Validator](/tools/spf-syntax-validator) to find the missing include.

DKIM failure means the cryptographic signature didn't verify. The most common innocent cause is body modification in transit (a mailing-list footer, a corporate disclaimer added by a gateway, line-ending conversion). The most common malicious cause is forgery. To tell them apart, look at the rest of the headers: if SPF and DMARC pass, DKIM-fail is usually just a forwarder being noisy. If everything fails together, suspect spoofing.

ARC (Authenticated Received Chain, RFC 8617) lets forwarders preserve the original authentication results for the final receiver, even when the act of forwarding broke SPF or DKIM. Each forwarder adds an ARC-Seal with a cv= status (pass/fail/none). A `cv=pass` on the latest seal means the chain is intact and the final receiver can honor the original sender's auth verdict. Google, Microsoft, and Yahoo honor ARC; many smaller receivers don't.

Legitimate reasons: a sales rep using a CRM (CRM owns the Reply-To), an ESP routing replies to a webhook, a no-reply From: with a real Reply-To for support. Suspicious reason: a phishing attempt where the attacker uses a believable From: but routes your reply to a controlled mailbox. The combination of From-domain ≠ Reply-To-domain plus SPF/DKIM failure is one of the strongest phishing signals.

Headers prefixed with `X-` are non-standard, added by specific software (mail servers, spam filters, ESPs). The ones worth knowing: `X-Spam-Status` and `X-Spam-Score` (SpamAssassin verdict), `X-Forefront-Antispam-Report` (Microsoft Defender), `X-Gm-Phishy` (Google explicitly flagged as phishing), `X-Mailer` (which software composed the message), `X-Originating-IP` (composer's IP, when set). The analyzer decodes the verdict-bearing ones into plain English.

No. The entire analyzer runs in your browser tab — parsing, classification, verdict generation. Nothing is uploaded. There is no network request to our servers when you analyze a message. If you toggle on the optional "compare against live DNS records" feature, that triggers a public DoH lookup (the same kind any DNS lookup does), but the message contents never leave your machine.

From: is the user-facing sender, set by the sender's mail client. Return-Path: is the SMTP envelope sender (the address that bounces go to), written by the receiving server based on what the sending server announced at the SMTP "MAIL FROM" stage. Return-Path is much harder to forge end-to-end. SPF checks against Return-Path; DMARC checks alignment between From and the domains that SPF/DKIM authenticated.

Strong when based on hard signals (DMARC failed + brand impersonation + punycode = high confidence phishing). Weaker when based on soft signals alone (Return-Path on a different domain is normal for ESPs, not a spoof). We never claim a numeric confidence score because the underlying signals don't support one. The verdict banner gives you a level (Legitimate / Caution / Suspicious / Likely phishing) and a sentence explaining which signal drove it, so you can decide whether to trust our read.

Yes — drag the file onto the upload zone, or click to select. We only read the first 512 KB (where the headers always live) so even .eml files with large attachments work. The 20 MB upper limit is a memory-safety cap; nothing is uploaded.

The most common cause is greylisting — many spam filters refuse the message on first delivery attempt and accept it on the retry, which spammers usually skip. A 5–15 minute gap is typical. Longer delays (30+ minutes) can mean a server was queued for capacity, a downstream issue, or a quarantine/release cycle. The analyzer flags hops over 30 minutes as anomalies.

MxToolbox and Microsoft MHA show you the raw data in a table. This tool adds: a plain-English verdict at the top, display-name and Reply-To mismatch detection, brand impersonation flagging, punycode/homoglyph detection, explanation of WHY each auth check failed (not just pass/fail), an optional comparison against the sender's current live DNS records, and a privacy guarantee (we don't see your headers). We also pair it with our [DMARC Report Analyzer](/tools/dmarc-report-analyzer) for the receiving end.

Still have questions?

Contact our support team →

Receive DMARC reports? Analyze them too.

Header analysis is one message at a time. DMARC aggregate reports show you every sender using your domain across days of mail. 200 free credits for verifying your list on the way out.