Back to blog
DevelopmentTestingMailhogMailpitMailCatcherMaildevComparison

MailHog vs Mailpit vs MailCatcher vs Maildev: Which Local Email Testing Tool Should You Use?

A head-to-head comparison of the four most popular local email testing tools. Features, performance, Docker setup, and when to use each — updated for 2026.

SendPigeon TeamMarch 27, 20268 min read

Choosing a local email testing tool comes down to four options: MailHog, Mailpit, MailCatcher, and Maildev. All four catch outgoing SMTP emails and display them in a web UI — but they differ in features, maintenance status, and setup.

Short answer: Use Mailpit. It's the most feature-complete, fastest, and actively maintained. If you're currently on MailHog, Mailpit is a drop-in replacement (same ports, compatible API).

TL;DR
  • Mailpit — Best overall. Drop-in MailHog replacement. Full-text search, TLS, actively maintained.
  • MailCatcher — Good if you already have Ruby. Lightweight, still maintained.
  • Maildev — Good if you want npm install. Simple UI, Node.js based.
  • MailHog — Abandoned since 2020. Still works but no updates or security patches.
  • None of the above — If you also need production sending, SendPigeon CLI does local capture and real sending from the same SDK.

Quick comparison

MailHogMailpitMailCatcherMaildev
StatusAbandoned (2020)Active (weekly)Active (slower)Active (slower)
LanguageGoGoRubyNode.js
SMTP port1025102510251025 (or 25)
Web UI port8025802510801080
InstallDocker / binarybrew / Docker / binarygem installnpm install / Docker
SearchBasic regexFull-textNoneBasic
TLS supportNoYes (STARTTLS + SMTPS)NoYes (STARTTLS)
Email taggingNoYesNoNo
Link checkingNoYesNoNo
APIRESTREST (MailHog-compatible)RESTREST
StorageIn-memory / MongoDBIn-memory / SQLiteIn-memory / SQLiteIn-memory
Docker image~40 MB~20 MB~150 MB~100 MB
Open issues100+ (unresponsive)Actively triagedLowModerate
Production sendingNoNoNoNo

Mailpit

The clear winner for most teams. Mailpit is a standalone Go binary with zero dependencies, the best feature set of any local email testing tool, and active weekly development.

Install:

# macOS
brew install mailpit

# Docker
docker run -p 1025:1025 -p 8025:8025 axllent/mailpit

# Or download binary from GitHub releases

Docker Compose:

services:
  mailpit:
    image: axllent/mailpit
    ports:
      - "1025:1025" # SMTP
      - "8025:8025" # Web UI

Strengths:

  • Drop-in MailHog replacement (same ports, compatible API)
  • Full-text search across subject, body, recipients, headers
  • Email tagging and organization
  • Link checking in captured emails
  • TLS support (STARTTLS + SMTPS)
  • Handles 100–200 emails/second over SMTP
  • Half the Docker image size of MailHog
  • SQLite storage option (persistent across restarts)

Tradeoffs:

  • Local only — no cloud option for CI without self-hosting
  • No production sending path

Best for: Any team doing local email testing, especially those migrating from MailHog.

Mailpit on GitHub · Mailpit vs MailHog deep dive


MailCatcher

Lightweight Ruby gem, still maintained. MailCatcher has been around since before MailHog existed. It does one thing — catches SMTP emails — and does it well.

Install:

gem install mailcatcher
mailcatcher
# SMTP on localhost:1025, Web UI at localhost:1080

Docker Compose:

services:
  mailcatcher:
    image: schickling/mailcatcher
    ports:
      - "1025:1025" # SMTP
      - "1080:1080" # Web UI

Strengths:

  • Simple and lightweight
  • Low memory footprint
  • Clean, minimal web UI
  • Still receives updates
  • Works without Docker (just gem install)

Tradeoffs:

  • Requires Ruby
  • No search functionality
  • Fewer features than Mailpit (no tagging, no link checking, no TLS)
  • Web UI on port 1080 (different from MailHog's 8025)

Best for: Ruby developers or teams who want the simplest possible local email catcher.

MailCatcher website


Maildev

Node.js-based, npm install. Maildev is aimed at Node.js developers who want a local SMTP server they can install from npm.

Install:

# npm
npm install -g maildev
maildev

# Docker
docker run -p 1080:1080 -p 1025:1025 maildev/maildev

Docker Compose:

services:
  maildev:
    image: maildev/maildev
    ports:
      - "1025:1025" # SMTP
      - "1080:1080" # Web UI

Strengths:

  • Familiar install for Node.js developers (npm install)
  • Clean, modern web UI
  • STARTTLS support
  • REST API for automation
  • Relay mode (forward specific emails to a real SMTP server)

Tradeoffs:

  • Less frequent releases than Mailpit
  • In-memory only (no persistence)
  • Larger Docker image than Mailpit
  • Node.js dependency

Best for: Node.js developers who want npm-based installation and don't need advanced features.

Maildev on GitHub


MailHog

The original, now abandoned. MailHog was the default choice for years, but it hasn't received an update since 2020. It still works for basic SMTP capture, but it's missing features that modern alternatives provide and has 100+ unresolved issues.

Install:

# Docker
docker run -p 1025:1025 -p 8025:8025 mailhog/mailhog

# Go install
go install github.com/mailhog/MailHog@latest

Docker Compose:

services:
  mailhog:
    image: mailhog/mailhog
    ports:
      - "1025:1025" # SMTP
      - "8025:8025" # Web UI

What it lacks vs modern alternatives:

  • No full-text search (basic regex only)
  • No TLS support
  • No email tagging or organization
  • No security patches since 2020
  • Hardcoded message size limits
  • 100+ open issues with no maintainer response

If you're still using MailHog, migrating to Mailpit is a one-line change — swap the Docker image from mailhog/mailhog to axllent/mailpit. Ports and API are compatible.

MailHog on GitHub · Migration guide: MailHog → Mailpit


SMTP configuration (works with all four)

All four tools default to SMTP on localhost:1025, so the same application config works across them:

// Node.js (Nodemailer)
const transport = nodemailer.createTransport({
  host: "localhost",
  port: 1025,
});
# Python (smtplib)
import smtplib

with smtplib.SMTP("localhost", 1025) as server:
    server.sendmail("from@example.com", "to@example.com", message)
// Go (net/smtp)
err := smtp.SendMail("localhost:1025", nil, "from@example.com",
    []string{"to@example.com"}, []byte(message))

The only difference is the web UI port: Mailpit and MailHog use 8025, MailCatcher and Maildev use 1080.


What about production sending?

None of these four tools send real emails. They're development tools that catch and display outgoing mail. When you deploy, you'll need a separate email service — and typically separate code to integrate it.

SendPigeon CLI bridges this gap. It gives you local email capture (like Mailpit) plus production sending through the same SDK:

# Local dev — catches emails at localhost:4100
npx @sendpigeon-sdk/cli dev
import { SendPigeon } from "sendpigeon";

const pigeon = new SendPigeon("sp_test_xxx");

// Same code for dev and production
await pigeon.send({
  from: "hello@yourdomain.com",
  to: "user@example.com",
  subject: "Order confirmed",
  html: "<h1>Your order is confirmed</h1>",
});

Set SENDPIGEON_DEV=true for local capture, remove it to send real emails. No code changes between environments.

Get started with SendPigeon CLI


Which should you choose?

Replacing MailHog?Mailpit. Same ports, compatible API, one-line Docker image swap.

Already have Ruby?MailCatcher. Simple gem install, lightweight, no Docker needed.

Node.js project, want npm install?Maildev. Familiar toolchain, decent UI.

Want local testing + production sending?SendPigeon CLI. One tool, one SDK, dev to production.


FAQ

What is the best MailHog alternative?

Mailpit is the best drop-in replacement — same ports, compatible API, actively maintained. For zero-install local testing with production sending built in, SendPigeon CLI is also worth considering.

Is Maildev still maintained?

Yes, but development has slowed. The last significant update was in early 2024. Mailpit is more actively maintained and has more features.

Which local email testing tool is fastest?

Mailpit. It handles 100–200 emails per second over SMTP, significantly more than MailHog, MailCatcher, or Maildev.

Can I use MailCatcher instead of MailHog?

Yes. MailCatcher captures SMTP emails and shows them in a web UI, just like MailHog. The main difference is MailCatcher requires Ruby, uses port 1080 for the web UI (vs 8025), and is still actively maintained.

Which tool works without Docker?

MailCatcher installs via gem (Ruby), Mailpit has standalone binaries and Homebrew, Maildev installs via npm. SendPigeon CLI runs via npx with no installation at all.

Do any of these tools send real emails?

No. MailHog, Mailpit, MailCatcher, and Maildev are all local testing tools that catch emails without delivering them. For a tool that does both local testing and production sending, see SendPigeon CLI.


Related