MailHog годами был ответом по умолчанию: поднять один контейнер, направить приложение на порт 1025, смотреть перехваченную почту на порту 8025. Он всё ещё работает, и во множестве docker-compose.yml он так и лежит — но проект больше не поддерживается, и в README его преемника Mailpit сказано прямо: MailHog «больше не поддерживается и не получал обновлений и исправлений безопасности уже несколько лет». Для инструмента, который разбирает недоверенный MIME, созданный вашим же приложением, важнее всего именно отсутствие исправлений безопасности.
Хорошая новость: преемник слушает те же два порта, поэтому для большинства проектов это пятиминутная правка в compose-файле.
Что делал MailHog и почему его возраст важен
MailHog делал три вещи хорошо: говорил по SMTP (порт 1025), показывал перехваченные письма в веб-интерфейсе (порт 8025) и отдавал JSON API, чтобы тесты могли их читать. Ещё были хранение в памяти с опцией MongoDB или файла, замена sendmail — mhsendmail, живые обновления через EventSource и «chaos»-режим для проверки обработки ошибок.
Ничего из этого не сломалось. Проблема в том, что происходит вокруг неподдерживаемой зависимости:
- Нет исправлений безопасности. Парсинг MIME — ровно тот код, который получает CVE, а ловушка принимает письма откуда угодно: staging-инстанс, доступный из интернета, — это сервис, а не игрушка.
- Образы контейнеров перестают собираться. Ваш закреплённый тег работает до тех пор, пока не поедет базовый образ или платформа под ним.
- Экосистема ушла вперёд. Прямым преемником стал Mailpit (Go, один бинарник), сторону .NET и Windows закрывает smtp4dev, Ruby и Node — Mailcatcher и MailDev, и все они развиваются.
- Мелкие удобства (поиск, проверки, автоочистка, POP3) есть только у преемников.
Что использовать вместо
| Инструмент | Что это | Почему выбрать |
|---|---|---|
| Mailpit | Go, один бинарник или контейнер, активно развивается | ближе всего к замене «в один шаг»: те же порты по умолчанию, плюс REST API, проверки HTML, ссылок и «спамности», опциональный POP3, live-обновления по веб-сокетам и автоочистка |
| smtp4dev | .NET, бинарник или контейнер | командам на Windows и .NET |
| Mailcatcher (Ruby) / MailDev (Node) | внутри вашего стека | когда ловушка нужна как gem или npm-зависимость |
| Этот инстанс | приватно ведёт оператор | ничего не нужно запускать и обслуживать, SMTP и вебхуки на одном адресе, ссылки шаринга и JSON-экспорт для скриптов и ИИ |
| Коммерческие песочницы | у вендора | когда нужны SSO, общие инбоксы, поддержка и SLA |
Переезд с MailHog на Mailpit
Порты по умолчанию совпадают: SMTP на 1025, UI на 8025. В Docker Compose меняется имя образа (и путь тома, если вы его монтировали) — маппинг портов остаётся, а конфигурация приложения не меняется вообще, потому что оно знает только хост и порт.
Три детали, которые отличаются после смены образа:
- Переменные окружения с префиксом
MP_вместоMH_. Если вы настраивали хранилище MailHog, перенесите две-три реально используемые; если не настраивали — делать нечего. mhsendmailстановитсяmailpit sendmailи используется так же: вphp.iniили любой другой конфигурации sendmail.- Хранилище — один файл (или память), не MongoDB. Если вы полагались на Mongo, чтобы письма не пропадали при перезапуске, это единственное, что стоит запланировать.
Старый контейнер оставьте закомментированным на день: возврат будет стоить одну строку.
Что вы получаете и что теряете
Получаете: активную поддержку, современный интерфейс с поиском, проверки HTML, ссылок и «спамности», опциональный POP3, чтобы забирать перехваченные письма в реальный клиент, live-обновления, REST API для проверок и автоматическую очистку (по умолчанию хранятся последние 500 писем). Ещё есть замена sendmail и chaos-режим для проверки ошибок SMTP.
Теряете: хранение в MongoDB. Всё остальное, что умел MailHog — SMTP на 1025, UI на 8025, JSON API, персистентность, тесты на сбои, — имеет аналог.
Если запускать вообще ничего не хочется
MailHog и Mailpit — это сервисы, которыми владеете вы: контейнер, том, путь обновления и человек, который заметит остановку. Этот инстанс — другой компромисс: SMTP и перехват вебхуков на одном адресе, без счётчика писем, без обслуживания, с read-only ссылками шаринга и JSON-экспортом для скриптов и ИИ-ассистентов. Его нельзя поставить себе (код не распространяется), и в этом весь смысл: если self-hosting обязателен — ставьте Mailpit.
Что дальше
- Альтернативы Mailtrap: бесплатные, open-source и self-hosted — более широкое сравнение, включая коммерческие песочницы.
- Как тестировать отправку писем, ничего не отправляя — четыре шага, которые работают и с Mailpit, и с smtp4dev, и с этим инстансом.
- Как ловить вебхуки локально без ngrok — та же задача, но для колбэков.
- Лимиты этого инстанса — размеры, сроки хранения и квоты одной таблицей.