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.

Что дальше