Jak zprovoznit slepý SMTP server pro testování PHP aplikací

Na kurzech se mi lidé neustále diví, že PHP aplikace provozovaná na lokálním počítači neumí poslat mail. Různá řešení typu MAMP nebo WAMP někdy obsahují, jindy neobsahují SMTP server, který to zařídí. Ovšem daleko lepší je použít tzv. falešný či slepý SMTP server, který poštu sice převezme, ale už ji nepředá dál.

Reklama

Co je potřeba k tomu, abyste z webové stránky psané v PHP a provozované na lokálním počítači mohli odeslat e-mail? Pokud nebudeme řešit různé speciální knihovny a odesílání pošty přes vzdálený SMTP server, pak potřebujete nějaký program, který vytvoří SMTP server pro odesílání pošty ve vašem počítači.

Netuším, jak jsou na tom jiné distribuce a balíčky Apache+MySQL+PHP ve Windows, ale VertrigoServ svého času nic takového neměl a Acquia Dev Desktop používá ve Windows XMail. Nic jiného jsem ve Windows myslím nepoužíval. V OS X mi rovněž běží Acquia Dev Desktop a MAMP, ovšem ani jeden SMTP server neobsahuje. Tipy na samostatné SMTP servery najdete ve starším článku SMTP server pro vaše aplikace zdarma.

Než však začnete instalovat nějaký SMTP server do Windows, chvíli počkejte. Představte si, že stavíte eshop a potřebujete otestovat třeba hromadné odeslání mailů zákazníkům. Nebo třeba odesílání newsletterů z modulu Simplenews v Drupalu. Asi by nebylo nejlepší, pokud by všechny maily z nějaké zálohy webu přesunuté na lokální počítač odcházely skutečným adresátům. A to by se při spuštění SMTP serveru na lokálním počítači stalo.

Řešením jsou tzv. slepé nebo falešné SMTP servery (dummy SMTP). Z pohledu aplikace psané v PHP (nebo jiném jazyce) se tváří jako skutečný SMTP server a převezmou od ní poštu k odeslání. Rozdíl je však v tom, že ji nikam dále nepředají a umožní vám v jednoduchém rozhraní prohlížet, jak vypadá pošta připravená k odeslání z vaší webové aplikace.

Mám pro vás pár tipů na zprovoznění slepého SMTP serveru ve Windows a na OS X.

smtp4dev – slepý SMTP server pro Windows

V prostředí Windows je realizace tohoto zadání velmi snadná. Slepých SMTP serverů existuje několik. Doporučuji stáhnout bezplatný open source program smtp4dev. Po spuštění začne naslouchat na standardním portu a veškeré zprávy, které ze své PHP aplikace na lokálním serveru odešlete, se zobrazí v jeho okně. Program čeká na pozadí a je minimalizovaný do systémové oblasti Windows (jak je to na Windows 8, nevím, můžete doplnit).

smtp4dev

Na zprávy zachycené pomocí smtp4dev stačí kliknout a hned si můžete prohlédnout jejich obsah. To vše bez toho, že by se něco z počítače skutečně odeslalo, což je žádoucí z výše uvedených důvodů.

Odesílání pošty z PHP v OS X

O něco složitější je situace v prostředí operačního systému OS X. Jeho součástí je Postfix, poštovní server pro odesílání pošty z aplikací (nikoli ovšem z věcí jako Mail.app a podobných). Abyste jej mohli použít, je potřeba v prostředí OS X 10.8.4 spustit tuto sadu příkazů v terminálu:

sudo mkdir -p /Library/Server/Mail/Data/spool
sudo /usr/sbin/postfix set-permissions
sudo /usr/sbin/postfix start

Prvními dva příkazy možná nejsou nezbytné, nejsem si jistý. Zjistíte po zadání posledního z příkazů, který Postfix startuje. V souboru php.ini (u Acquia Dev Desktopu jej lze otevřít přímo z nastavení, v MAMP jej najdete v /Applications/MAMP/conf/php5.3/php.ini) najděte řádek sendmail_path = a upravte jej do následující podoby:

sendmail_path = /usr/sbin/sendmail -t -i -f  jméno@doména

Nové nastavení uložte a restartujte webserver. Nyní můžete vyzkoušet odesílání pošty. Já jsem v Acquia Dev Desktop zkusil odeslání zapomenutého hesla z instalace Drupalu a v MAMP totéž z instalace WordPressu. Obojí by mělo fungovat.

Spuštěním Postfixu docílíte toho, že PHP funkce mail() bude fungovat, nicméně zprávy budou z počítače skutečně odcházet, což nemusí být žádoucí. Drobnou úpravou konfigurace je tedy potřeba zajistit, že Postfix bude poslouchat na jiném portu a zachycené zprávy předávat ke zpracování nějakému slepému SMTP serveru.

Řekněme, že Postfix nastavíme pro poslech na portu 1025. V tom případě v Terminálu spusťte:

sudo ipfw add 1025 forward 127.0,1025 ip from any to any 25 in

Zeditujte soubor /etc/postfix/main.cf a na jeho konec přidejte řádek relayhost = localhost:1025.

Tím by měla být změna nastavení hotova a zbývá nainstalovat nějaký slepý SMTP server a říci mu, aby poslouchal na portu 1025. Pokud by byl nadále problém, koukněte na tento návod.

Není-li pro vás necelých 9 € mnoho, zkuste placený prográmek MockSMTP.app. Spusťte jej a zkuste z PHP aplikace odeslat nějaký e-mail. Měl by se objevit v okně MockSMTP. Prohlížení funguje podobně jako ve Windows u smtp4dev.

MockSMTP.app

Vespod se můžete přepínat mezi HTML podobou e-mailu, jeho zdrojovým kódem a zobrazením kompletní hlavičky.

Jestliže nechcete do SMTP serveru nic investovat, zkuste si zkompilovat v Javě napsaný FakeSMTP. Poslouží stejně dobře, jen je jeho zprovoznění o něco složitější. Jednodušší alternativou je použití příkazového řádku a Pythonu. Pokud do něj vložíte následující příkaz…

sudo python -m smtpd -n -c DebuggingServer localhost:1025

…pak se veškeré odeslané zprávy z PHP zobrazí v okně terminálu, jak ukazuje obrázek.

SMTP přes Python v okně Terminálu

Tagy: 

Reklama

Komentáře

Pripadne smt-sink (http://www.postfix.org/smtp-sink.1.html) pro linux

ZDravím, dá se u smtp4dev nějak nastavit zobrazovaná znaková sada? Odchozí maily mi to odchytává, ale zobrazuje je se špatnou češtinou - podle hlavičky mailu to odchází se znakovou sadou UTF-8.
Díky za tip.

Nedaří se mi prosím zprovoznit upozornění o zachyceném odeslaném e-mailu.

Používám XAMPP a stahla jsem si smtp4dev, odkomentovala jsem v php.ini řádky pro port a localhost a smtp4dev spustila, ale po odeslání se mi nezobrazí nic.

Zkoušela jsem to i na jednoduchém scripnu pro odeslání zprávy a taky se nic nezobrazilo, tak netuším, kde je to třeba ještě povolit.

Firewall brána mi to taky neblokuje - je odblokováno.

Přidat komentář