MailHog: pomůcka pro testování e-mailů nejenom při vývoji webů

Potřebujete slepý vývojový SMTP server, který zachytí maily z aplikace či webu, ale už je nepředá dále? Pak vyzkoušejte MailHog. Funguje prakticky všude, je zadarmo a má webové rozhraní pro prohlížení zachycených zpráv.

Reklama

Pokud vytváříte webovou aplikaci, eshop nebo cokoli jiného, odkud budou odcházet e-maily, pravděpodobně nechcete používat skutečné SMTP. Málokdy se podobou e-mailů trefíte na první dobrou. Já tedy určitě ne, to se přiznám. Často podobu odeslaného mailu ladíte. Často potřebujete vyzkoušet, jak se chová odeslání většího množství zpráv.

Pro podobné účely je fajn mít při ruce nějakou aplikaci fungující jako slepý vývojový SMTP server. Někdo říká blind SMTP. Pro vytvářený web či program se tváří jako klasický poštovní server, který si převezme odesílanou zprávu. Už ji ale nedoručí, nechá ji u sebe a nabídne vám její prohlížení ve svém rozhraní.

Čas od času o podobných řešeních na Maxiorlovi píšu. Před nějakou dobou jsem objevil další takovou pomůcku a před pár dny ji konečně začal používat. Jmenuje se MailHog a je napsaná v jazyce Go.

Co je MailHog a co toto SMTP dovede

MailHog rozběhnete prakticky kdekoli. Aplikace napsané v jazyku Go se nemusí nijak speciálně instalovat, vlastně je jenom spustíte a je hotovo. MailHog běhá ve Windows, na Linuxu, na Macu. K dispozici je i jako image pro Docker, dáváte-li přednost virtualizaci.

Po spuštění začne poslouchat na zadaném portu, ukládat si zachycené e-maily a případně vám je zobrazí prostřednictvím webového rozhraní. Maily si ukládá buď do operační paměti, odkud zmizí po vypnutí MailHogu, případně lze použít MongoDB a ukládat je natrvalo do databáze.

K dispozici je také náhrada klasického sendmailu. V konfiguraci PHP tak zadáte cestu namísto k sendmailu právě k alternativě pro MailHog a mailujete tak do slepého serveru i bez jakýchkoli dalších úprav své webové aplikace.

Webové rozhraní funguje jako jednoduchý poštovní klient. Zprávy zobrazíte v jejich původní podobě, případně se lze přepínat mezi HTML, textovou podobou a zdrojem.

Nevýhodou je, že všechno máte v jedné schránce, i když MailHog použijete pro různé aplikace. Ono zde totiž není nic jako uživatelské účty pro přístup k zachyceným zprávám. Pokud si MailHog vystavíte veřejně na svém serveru, máte jen možnost přístup zaheslovat přes http autentifikaci.

Na druhou stranu, ke zprávám lze přistupovat i pomocí API a ty vybrané pak uvolnit pro odeslání na skutečný poštovní server.

MailHog

Jak nainstalovat vývojové SMTP MailHog na server s Debianem

Dává mi zde smysl využít hotový balíček a kontejner pro Docker. Ale protože nemám Docker stále ve svém workflow, použil jsem MailHog přímo na serveru bez kontejnerování. Následující postup jsem použil v Debianu, měl by fungovat také v Ubuntu.

Tím je instalace dokončena. Znovu načtěte webserver a přes phpinfo() se přesvědčte, že v konfiguraci je právě úprava pro mhsendmail.

Tip: Jelikož používám Virtualmin a Webmin, nemusel jsem hledat umístění toho správného php.ini ve složce s webem, ale stačilo toto nastavení pohodlně upravit přes Služby > PHP Configuration > Jiná nastavení u zvoleného webu.

Startujeme MailHog

Jakmile máte nainstalováno, pak stačí, abyste MailHog spustili následujícím příkazem:

mailhog -api-bind-addr 127.0.0.1:8025 -ui-bind-addr 127.0.0.1:8025 -smtp-bind-addr 127.0.0.1:1025

Tím mu vlastně říkáte, že se jeho API, webové rozhraní i SMTP samotné má pověsit na lokální IP adresu a poslouchat na portech 8025 (API a WEB UI), resp. na portu 1025 (SMTP). Nyní zkuste z PHP aplikace poslat nějaký e-mail. Měl by se vám zobrazit v prostředí MailHogu, které si otevřete zadáním adresy 127.0.0.1:8025 do webového prohlížeče.

Já jsem se rozhodl MailHog spouštět automaticky. Na serveru mám stejně „jen“ vývojové věci, takže není důvod, aby ta aplikace neběžela v jednom kuse. V Debianu i Ubuntu je potřeba vytvořit následující soubor:

/etc/systemd/system/mailhog.service

Do něj pak vložte následující obsah. USERNAME nahraďte za uživatelské jméno a 1.2.3.4 za IP adresu svého serveru.

[Unit]
Description=MailHog service

[Service]
ExecStart=/usr/local/bin/mailhog \
  -api-bind-addr 1.2.3.4:8025 \
  -ui-bind-addr 1.2.3.4:8025 \
  -smtp-bind-addr 127.0.0.1:1025 \
  -auth-file /home/USERNAME/mailhog.auth

[Install]
WantedBy=multi-user.target

Jak vidíte, spouštění MailHogu jsem trochu upravil. Jak jeho API, tak jeho webové rozhraní startuju na veřejné IP adresa. To kvůli tomu, abych se na ni dostal i z jiného počítače než přímo z toho serveru. Naopak, SMTP nechci poskytovat jiným strojům, vystavím jej jen pro lokální vývoj. Takže tam ponechávám 127.0.0.1.

Navíc jsem přidal ještě jeden přepínač, kterým MailHogu specifikuji cestu pro soubor s http autentifikací. Ukládá se do něj klasicky jméno:heslo. Heslo je bcryptované, vygenerovat jej můžete například příkazem MailHog bcrypt vaseheslo.

Příkazem systemctl start mailhog službu MailHogu spustíte, automatického startu po spuštění systému docílíte ještě příkazem systemctl enable mailhog.

A to je vše. Pro další informace doporučuji zdroje, ze kterých jsem čerpal:

Alternativní vývojové a slepé SMTP

Nedá mi to, abych nezmínil další aplikace a služby podobného určení. Docela jsem si oblíbil Mailtrap.io. Je to webová služba, nemusím ji tedy instalovat a zvládne si ji zaregistrovat i zákazník. Nedávno jsem ale narazil na její omezení v podobě mailových zpráv v krátkém okamžiku.

Existuje také celá řada aplikací pro slepý SMTP server. Viz můj starší článek. Ještě v dobách Windows jsem si oblíbil smtp4dev, který tam zmiňuji mimo jiných.

Reklama

Komentáře

Ctu na mobilu, az se vyprazdnim, rychle utikam ke kompu rozjez si to na dockeru. Diky za clanek.

Rád jsem tyto chvíle zpříjemnil užitečným tipem :)

Tvořím weby. Nabízím poradenství pro Drupal. Jsem na Twitteru.

Přidat komentář