~/email-for-developers providers ↗
guide

Email Testing for Developers: Capture, Staging Inbox, and Cross-Client Rendering

Developers use one word, testing, for three separate jobs: capturing what the application sends, checking a message in a real inbox, and previewing how it renders across email clients. Each job wants a different tool, and reaching for the wrong one is how an afternoon disappears.

last updated 2026-07-09 4 sections
section 01

Capture what the app sends, locally

The first job is confirming the application produced and sent the right message. A local SMTP catcher accepts mail on a development port, stores it, and shows it in a browser instead of delivering it. Point the app SMTP config at 127.0.0.1 on the catcher port and every send lands in one place. This is the fastest loop for checking template variables, attachments, and headers.

toolruntimedefault portsstatus
MailpitSingle Go binary1025 SMTP / 8025 webActively maintained
MailDevNode1025 SMTP / 1080 webMaintained, slower cadence
MailCatcherRuby gem1025 SMTP / 1080 webSlow releases
MailHogSingle Go binary1025 SMTP / 8025 webUnmaintained since 2020
section 02

Send through a real inbox before you send to users

A catcher proves the app sent something. It does not prove a real mail server would accept the message or show how a spam filter scores it. A staging inbox gives a message a genuine SMTP path without touching real recipients. Mailtrap is the hosted version, with a shared team inbox, spam scoring, and blacklist checks. Ethereal creates a throwaway account over its API and delivers nothing, which suits CI because there is no inbox to clean up afterward.

  • ok Route staging and preview traffic to a separate inbox, never to live users
  • ok Check the spam score and authentication result, not only the rendered body
  • ok Keep production sending credentials out of the staging path
section 03

Preview rendering across clients

Capture and staging tools render HTML in one browser engine. Real inboxes do not. Classic Outlook on Windows uses the Word rendering engine, Gmail strips some styles, and dark mode rewrites colors. Cross-client preview tools such as Litmus and Email on Acid run a template through dozens of real clients and return a screenshot grid. Parcel adds live previews inside a code editor. A screenshot grid is the only reliable way to catch a layout that breaks in one client and works everywhere else.

  • ok Classic Outlook on Windows (Word engine) for table and margin breakage
  • ok Gmail web and the Gmail app for clipped or stripped styles
  • ok Apple Mail and iOS for dark-mode color inversion
  • ok A plain-text fallback for clients that block HTML or images
section 04

Wire the checks into CI

Manual preview does not scale past a handful of templates. In CI, send each template to Ethereal or a MailDev instance, then assert on the captured output: subject line, key links, and a snapshot of the HTML. A diff on the rendered HTML catches an accidental template change before it ships. Reserve the paid cross-client preview run for release branches, since those tools bill by preview.

reading this as developers picking email infrastructure

The question here is which one a backend engineer would rather operate. That means SDK depth in the language already in use, whether a retry can safely be replayed, how much the event log tells you when a customer says the email never arrived, and whether the pricing curve stays sane as volume grows.

Applied to email testing for developers: capture, staging inbox, and cross-client rendering, that means weighing developer experience, SDK breadth, idempotency keys, and operating track record ahead of the rest, against password resets, receipts, and magic links shipped from application code.

related pages