Most mail clients are helpful: they prefetch links, load images, and render whatever the message asks for. For testing, helpful is broken — a security scanner that “visits” your magic link consumes the token before your test does, and a loaded tracking pixel marks the mail opened before a human ever saw it. MailMatter behaves like a lab instrument instead: nothing in a message is ever fetched or followed unless a human deliberately clicks.
The guarantees
- Hermetic on our side. The server never fetches anything on a message’s behalf. Remote resources are only ever requested by your browser, and only after a deliberate human action.
- Sandboxed HTML rendering. Email HTML renders inside
<iframe sandbox="" srcdoc="…">— no scripts, no same-origin access — with adefault-src 'none'content-security policy. - Remote images blocked by default. Tracking pixels and CSS
url()backgrounds stay unloaded until you press Load remote images on that message. Blocking them is the point: an unread OTP email should look unread to the sender.

- Links are inert text, never anchors. The page never renders a
clickable
<a href>for a message link, so nothing — not a browser prefetcher, not an extension, not a stray click — can consume a one-time link by accident. Acting on a link is an explicit copy or open-in-new-tab button press.

- Attachments are opaque downloads. Attachment bytes are served as
application/octet-streamwithnosniffand a download disposition, so an attacker-controlled “invoice.html” can never execute on the MailMatter origin. - Raw bytes on demand. Every message exposes its byte-exact
.eml(GET /api/message/:id/raw) for the cases where a renderer would hide the bug — encoding issues, header forensics, DKIM checks. - Not indexed. Every response carries
X-Robots-Tag: noindexandrobots.txtdisallows all crawling, so inbox contents never leak into a search index.
What this means for your assertions
Assert on what the API gives you, not on a rendered view:
textis the decoded plain-text body — grep it for OTP codes.linksis the list of verbatimhrefvalues extracted from the message — compare them exactly; nothing has rewritten or resolved them.headersis the full header list — filter mailbox listings by your ownX-*metadata to keep parallel runs apart./rawis the untouched RFC 822 message when you need to assert on the wire format itself.
Why there are no ads
Ads are third-party outbound requests and tracking — exactly the traffic the hermetic promise exists to block. Monetization lives on the API surface (pricing), not on the page.
Related
- REST API — the message shape those assertions run against.
- Testing with MailMatter — getting the message into your test without a polling loop.