MailHog is done.
Its jobs aren't.

MailHog taught a generation of developers to catch email locally instead of spamming real people from dev. It hasn't shipped a release since 2020. If you're moving off it, the honest answer is two tools: Mailpit for localhost, and a real inbox for the tests that leave localhost.

mailpit for localhost · real MX for CI and staging
MAILHOG'S STATUS, CHECKED OCT 26, 2026
sources: github.com/mailhog/MailHog (releases, commits, issue #442), hub.docker.com/r/mailhog/mailhog, Homebrew/homebrew-core history of Formula/m/mailhog.rb
MAILPIT REPLACES MAILHOG WHEN
MAILFIXTURE IS RIGHT WHEN

MailHog was doing two jobs

Most teams that ran MailHog used it for two different things. The first is local development: point the dev server's SMTP at port 1025, open the web UI on 8025, and look at what your app would have sent. That job is alive and well — Mailpit does it today, is actively maintained, and keeps MailHog's default ports, so for many setups the migration is swapping the container image.

The second job is the one that hurts in CI: a test fixture. A shared MailHog container, a helper that calls /api/v2/search?kind=to, a retry loop, and a regex over Content.Body — the raw MIME body, quoted-printable soft line breaks and all. Moving that helper to Mailpit keeps every problem it already had: one shared store across parallel workers, polling instead of waiting, regex instead of extraction, and a container that only sees mail from apps whose SMTP config you control.

MailFixture covers only that second job, from the other side of the wire. Inboxes are real addresses on real domains with real MX records; your app sends through whatever it uses in that environment, the test waits server-side, and the code comes back as a typed field. It can't replace the first job — it's hosted, so it is no help when mail must stay on your machine. The wider layer-by-layer version of this decision is the fake SMTP vs. real test inbox guide.

Three tools, side by side

MailHog's column is what you have today. Rows where MailHog or Mailpit win say so.
MAILFIXTUREMAILHOGMAILPIT
Maintained Yes — hosted service No — last release Aug 2020 Yes — v1.32.0, Oct 2026
Price Free tier, paid from $15/mo Free, MIT — wins on price Free, MIT — wins on price
Works offline / air-gapped No — hosted only Yes Yes — the maintained choice
Receives mail via Real MX on real domains SMTP socket you point at (1025) SMTP socket you point at (1025)
Tests the production delivery path Yes — provider, DNS, templates No — mail never leaves the box No — mail never leaves the box
Isolation for parallel CI An inbox per test One shared store; filter by recipient One shared store; tags and search
Waiting for a message Long-poll, held server-side Poll the API, or a WebSocket / event stream Poll the API, or a WebSocket
OTP / link extraction extracted.otp.best, typed Your regex on the raw body Your regex on the body
SPF/DKIM/DMARC + spam score Automatic on every message No Optional SpamAssassin score, no auth verdicts
Release captured mail to a real server No — never sends Yes — wins here Yes, SMTP relay — wins here
SMTP fault injection No Yes, Jim chaos monkey — wins here Yes, Chaos — wins here
Default storage Postgres, 3–30 day plan retention In memory; MongoDB or maildir opt-in Temporary SQLite, newest 500 kept
Ops burden None Run it, and no upstream fixes Run, persist, and upgrade it
mailhog facts from github.com/mailhog/MailHog (readme, docs/JIM.md, MailHog-Server api routes), docker hub, homebrew-core history; mailpit facts from mailpit.axllent.org (runtime options, email storage, smtp relay, chaos) and its github releases — all checked oct 26, 2026. both are good tools; this table is about fit.

The MailHog test helper, moved

Here's the shape of a typical MailHog-backed CI helper — search the shared store by recipient, take the first hit, regex the raw body:

before · MailHog API v2
// every message ever sent to that address
const url = `http://mailhog:8025/api/v2/search` +
  `?kind=to&query=${encodeURIComponent(email)}`;
const { items } = await (await fetch(url)).json();

// raw MIME body: maybe quoted-printable, maybe multipart
const body = items[0]?.Content.Body ?? '';
const code = body.match(/\b\d{6}\b/)?.[0];
// …inside a retry loop with a sleep: nothing waits for you

The same test against MailFixture. The inbox is created per test, the wait is held server-side, and the code arrives already extracted — and because the address is real, it runs unchanged against localhost, staging, or a preview deploy:

after · signup.spec.ts · Playwright
const mail = new MailFixture(); // reads MAILFIXTURE_API_KEY

const inbox = await mail.createInbox({ ttlSeconds: 900 });
await page.fill('#email', inbox.address); // a real, routable address
await page.click('text=Send code');

const otp = await inbox.waitForOtp({ timeout: 30_000 });
await page.fill('#otp', otp);

Fair questions

Is MailHog still maintained?
No. The last release, v1.0.1, shipped in August 2020 and the last commit to the main branch landed in August 2022. In April 2023 its author wrote that he no longer has time to maintain it, and Homebrew removed the formula in April 2026 as unmaintained. The GitHub repository is not archived, but nothing indicates new releases are coming.
What should replace MailHog for local development?
Mailpit, not MailFixture. It does the same job, is actively maintained, uses the same default ports (SMTP 1025, web UI 8025), and has its own versions of MailHog's release-to-SMTP and chaos-testing features. Swapping the container image is usually most of the migration; scripts that call MailHog's /api/v2 endpoints need rewriting against Mailpit's API.
Do I have to migrate off MailHog right away?
Not if it sits on a private network and does its job — a working local trap is not an emergency. But it has had no fixes since 2020, so keep it off the public internet and don't build new pipelines on it. Plan the move the next time you touch that config.
Can MailFixture release captured messages to a real mail server like MailHog?
No. MailFixture never sends, relays, or forwards email — it only receives. If your workflow depends on releasing captured mail onward, Mailpit's SMTP relay is the maintained replacement for that MailHog feature.
100 messages/mo free · no card · mailpit stays on localhost
Start free Read the quickstart