EML Viewer & MIME Email Decoder

Paste a message or open an .eml file and press Inspect locally: headers, body, an isolated HTML preview and every MIME part — with Save for the decoded bytes — stay in the page, and nothing is uploaded.

Local processing ·
*.eml

How to read an .eml message without uploading it

Paste the source of a message into the box, or open an .eml file from disk, and press Inspect locally. The whole reading happens in the tab: nothing is uploaded and the page fetches nothing while it works. The result is split into the decoded headers, the plain-text body, a sandboxed HTML preview and a list of the MIME parts, so a message that mixes text, HTML and attachments can be read part by part.

Headers and bodies are decoded with the character set that each part declares: a subject sent as =?windows-1252?Q?Rechnung_=80_offen?= reads “Rechnung € offen”, a GB2312 body reads 后台任务已完成。, and UTF-8 keeps its accents. Parts are cut line by line at the MIME boundary instead of searching for that text anywhere in the body, so a line of dashes inside quoted text no longer ends the message early.

  1. Paste the message source into the box or drop an .eml file on the drop zone; the file name appears next to the zone and the text loads into the box.
  2. Press Inspect locally. The metrics count the headers, parts, attachments and input size, and the metadata card shows From, To, Subject, Date and Message-ID — a field the message does not carry shows a dash.
  3. Read the plain-text body: Copy puts it on the clipboard and Download saves it. A picked file names the download after itself (win1252-body.txt for win1252.eml); a pasted message saves as message-body.txt.
  4. Check the HTML preview. It is drawn in a sandboxed frame with external resources disabled, so a tracking pixel written into the HTML is never requested.
  5. Open the attachment list: each part shows its name, MIME type, decoded size and transfer encoding, and Save writes the decoded bytes to disk under the original file name.

What the decoder reads, and where it stops

What the decoder reads

The character set comes from each part’s own Content-Type header, not from the page: windows-1252 (“Betrag: €12,50 – fällig am Montag.”), GB2312/GBK (后台任务已完成。), UTF-8 and an unknown label that falls back to a tolerant byte reading all come out as text. Encoded words in headers (RFC 2047) are decoded, and the space between two adjacent encoded words is dropped the way the standard requires, so “Deploy finished” is not spaced twice.

Structure is followed line by line: a multipart part is split only where a line is exactly --boundary (trailing spaces allowed), so a quoted reply containing ----b1---- keeps its text. A multipart header without a boundary parameter, a boundary="" that carries no value and a single-quoted boundary no longer lose the body — it is shown as text. A message forwarded as message/rfc822 is parsed as a message, its body appears in the text pane and the wrapper is listed in the attachment table; a message nested deeper than twelve levels is flattened to text instead of vanishing.

The HTML preview

The preview keeps the message’s own markup and its <style> rules but removes whatever could load or run something else: script, iframe, object, embed, link, meta, base, form and form controls are deleted, on* handlers are dropped, and every URL attribute (src, href, poster, background and the rest) is pointed at an inert fragment unless it is a data: URL. srcset keeps only its inline candidates. That is what “external resources are disabled” means here: in a set of 25 tracking tricks — a plain pixel, a srcset, @import and url() inside a style block, an inline style — the patched preview made no request to the tracking host, where the version before it made four.

This is a filter for reading mail, not a malware scanner. It does not run scripts, does not fetch remote content, and cannot tell you whether a link in the message is safe to open.

Where the reader stops

The viewer decodes the message as it was written; it does not verify S/MIME or PGP signatures, does not decrypt protected messages, and does not repair a file that is not a message. Text parts are joined in the order they appear, so a message carrying several text/plain parts shows them one after another. Attachments are saved as bytes rather than opened, and there is no JSON export: the headers, the body, the preview and the part list are what the page produces.

Recent tools: