Docker a PHP mail

6. října 2020

Na Internetu je posílání emailů běžnou věcí. A i webová aplikace (často i jen webová prezentace) potřebuje odesílat emaily. Emaily se ukládají na serverech mail hostingu. Jak ovšem na odesílaní emailů?

Windows

Vývojáři webových aplikací, kteří používají Windows s odesíláním emailů měli vždy problém. Proto vznikly různé nástroje pro odesílání emailů nebo nástroje, které emaily z vývojového prostředí zachytávají.

Unix

Na linuxovém nebo jiném unixu je odesílání emalů standard. Maximálně, aby email nebyl zahozen nebo nespadl do SMAPu, tak je potřeba lokální/testovací stroj nastavil tak, aby emaily přeposílal přes mailserver, který je plně nakonfigurován tak, aby se zajistila vysoká doručitelnost emailů a emaily nepadaly do SPAMu.

Jinou možností je aplikaci nakonfigurovat tak, aby emaily odesílala skrze externí SMTP server. Je to docela dobré a univerzální řešení, ale musíte si pohlídat, že to tak má nastavené každá aplikace a na všech místech. Ovšem i tak některé emaily z nižší úrovně nemusí odcházet typicky informace o pádech aplikace, které často používají systémové odesílaní emailů (i když i toto zasílání emailů by šlo asi přenastavit).

docker mail

Docker

V současné době se hojně využívá Docker, který je výborný obvoláš pro vývoj aplikací. Ovšem s ním opět řešíte problém odesílání emailů. Protože v Dockeru vám běží jen jeden proces a nic dalšího, tedy ani mailserver. A pokud máte Docker na produkčním prostředí tak funkční odesílaní emailů je nutností.

Obecně se dá říct, že nejlepší je další technologie nepoužívat, pokud k tomu není vyloženě důvod. Tedy pokud do není potřeba, je Docker na produkci jen zbytečná technologie, kterou musíte znát. Každou použitou technologii by jste totiž, měli být schopni spravovat a mít na to čas, jinak si zaděláváte na problémy.

Docker a PHP mail

Jak tedy správně v Dockeru nakonfigurovat odesílání emailů z PHP aplikace?

Jak jsem již zmínil v článku Docker a Cron, v dockeru typicky běží jen jeden proces. Proto v případě běhu webové aplikace (web-serveru s PHP) v Dockeru zjistíte, že v systému neběží mailserver, tedy služba, která je potřeba pro odeslání emailu. Maily tedy musíte z PHP skriptu odesílat pomocí SMTP protokolu přes externí službu. A nebo je možnost Docker image upravit tak, aby jste mohly i nadále používat PHP funkci mail().

Konkrétně řešením je, aby PHP používalo pro odesílání jiný příkaz, který bude emaily odesílat přes externí mail server.
Pro odesílání použijeme systémovou utilitu msmtp. Ve starších verzích linuxových distribucí se používal ssmtp.

Konfigurace pro msmtp je v souboru /etc/msmtprc.

Obsah konfiguračního souboru může vypadat takto:

account default
host smtp.example.com
port 587
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
tls_certcheck on
auth on
user user@domain.com
password "password"
from "user@domain.com"
logfile /var/log/msmtp.log

Ještě je potřeba upravit konfiguraci PHP. Tedy do souboru php.ini doplnint:

[mail function]
sendmail_path = /usr/bin/msmtp -t

Následujícím příkazem po zadaní do konzole běžícího kontejneru můžete vyzkoušet odeslání emailu přes msmtp:

msmtp -d -a default -i -t <<END
From: from@example.com
To: toto@example.com
Subject: test msmtp
test
END

Pokud jste vše nastavili správně, tak vám toto funguje a můžete v PHP použít funkci mail() běžným způsobem.

Důvěryhodnost emailů

Přesto, že maily odesíláte, nemusí příjemcům dorazit do inboxu. Emaily mohou spadnout do SPAMu nebo dokonce mohou být emaily zahozeny. Proto si vždy prověřte přes jaké mailservery poštu odesíláte a jestli mají emaily vysokou důvěryhodnost, teprve pak jste udělali maximum, aby emaily dorazily úspěšně do schránky příjemce.

Články na podobné téma

Operační systém GNU/Linux
Jak začít správně používat Docker
Příprava linuxového serveru pro běh webové aplikaci v jazyce Python
Jak řešit špatný výkon sdílených souborů u Dockeru
GitLab - nástroj na správu, verzování, CI/CD a vedení projektů
Instalace Linuxu na dedikovaný server HPE ProLiant DL320e
Jak provést zátěžový test webové aplikace
Proč používat filesystém JFS
Jak bootovat z 4TB disku s GTP pomocí UEFI
Jak nainstalovat operační systém Magei Linux bez DVD mechaniky
Souborový systém Btrfs
Raspberry PI
Jak zprovoznit vzdálené přehrávání přes síť na televizi s DLNA
Upgrade Mandriva Linuxu za běhu
Poznámky ke GNU/Linux
WINE - spouštíme programy pro Windous pod Linuxem
Yocto Project: Build vlastního operačního sytému pro embedded zařízení
Lenovo ThinkPad X1 Carbon: zprovoznění LTE modemu EM7544
Docker a PHP mail
Docker a Cron
Virtualizace Proxmox