The mail viewer opens email as it was received - a saved .eml, an Outlook .msg with its winmail.dat, or a whole .mbox folder - and shows it as a mail program would: who it is from and to, the date, the message itself, and its attachments to open or save. Forwarded messages open inside it, pictures sent with the message show in place, meeting requests show when and where, and messages in any language and character set read as written.
The message is shown in a sealed frame where no script runs, and pictures from the internet are held back until the reader asks - so opening a newsletter does not tell its sender it was read. A mailbox lists its messages newest first, gathers them into conversations, and searches subjects, people and text.
Try it with your own files in confidence: they are opened by your browser, on your device. Nothing is uploaded, no copy reaches us or anyone else, and nothing is kept once you close this tab.
A design studio's mailbox
An invented studio's week: a project conversation with a sketch and a spreadsheet attached, a newsletter whose tracking picture is held back, a meeting request, a forwarded quote and a message in Japanese. Search it, gather it into conversations, or drop your own .eml, .msg or .mbox files on it.
// Node 18 or later, from the Pro package: a mailbox export turned into a searchable text index.
import { readFileSync, writeFileSync } from 'node:fs';
import { openMail, threadMailbox, messageAsText } from './dist/node/bmx-mail-viewer.mjs';
const { entries } = openMail(readFileSync('support.mbox'), 'support.mbox');
const index = threadMailbox(entries).map(thread => ({
subject: thread.subject,
latest: thread.latest,
text: thread.entries.map(i => messageAsText(entries[i].read())).join('\n\n'),
}));
writeFileSync('support-index.json', JSON.stringify(index));
A complaint, forwarded to the warehouse
One message as a shop's customer service team forwards it: their note on top, the customer's complaint attached as a message of its own, and the customer's photo of what arrived. Pictures from the internet are blocked outright here, as a support desk might choose.
Get the code
<script src="/assets/bmx-components.min.js"></script> <bmx-mail-viewer id="ml-one" label="Forwarded complaint" locale="en-GB" remote-images="block" style="inline-size: 100%; --bmx-mail-viewer-height: 34rem"></bmx-mail-viewer>