mail()
a SMTP) v PHPV PHP máme v podstatě 2 možnosti, jak odesílat maily:
mail()
, která má relativně dost omezení,mail()
Myšlenka použití je jednoduchá: Zavoláte funkci:
mail('jan@barasek.com', 'Předmět', 'Text zprávy...');
A PHP samo zajistí odeslání.
Interně odeslání funguje tak, že se načte konfigurace z php.ini
a hledá se výchozí SMTP server, přes který bude mail doručen. Vyžaduje to tedy předchozí konfiguraci webového serveru.
Hlavní úskalí funkce mail()
je zejména v tom, že si programátor musí řešit celou logiku sám. Jde například o vyhození hlaviček ohledně kódování, napojení certifikátů pro šifrování zpráv a podobně.
V případě selhání odesílání se vrací hodnota false
, kterou si musíme sami odchytit a zpracovat. Zjistit konkrétní chybu můžeme omezeně prostřednictvím volání error_get_last()
, takže například:
if (@mail($to, $subject, $message) === false) {
throw new \Exception(
'Can not send mail: '
. (@error_get_last()['message'] ?? '')
);
}
TIP: Všimněte si, že jsme funkci nikde nepředali adresu, z které chceme mail odesílat a jaké se má použít kódování.
Veškeré toto nastavení je potřeba předávat prostřednictvím hlaviček.
Pokud funkci mail()
musíte i přesto použít (například kvůli hostingu), doporučuji k odesílání použít balíček nette/mail
a službu SendmailMailer
, která problematiku odesílání mailů řeší dobře.
SMTP znamená Simple Mail Transfer Protocol
, což (jak brzy uvidíte) je velká pravda.
SMTP je na rozdíl od funkce mail()
vyspělejší protokol s pokročilou možností konfigurace nejen ze strany PHP, ale i přímo na poštovním serveru.
Podpora SMTP na hostinzích je v roce 2018 výborná.
SMTP v principu funguje tak, že se PHP nejprve naváže spojení se SMTP serverem (vyžaduje v PHP aktivní rozšíření php_openssl.dll
, která pravděpodobně už aktivní máte), během připojování dojde k autentizaci (ověření správnosti přihlašovací údajů) a poté můžeme se serverem komunikovat podobně, jako s databází - tedy odesílat jednotlivé požadavky, ale držet si stále jedno spojení. Velká výhoda SMTP je přímá podpora šifrování (známé jako TLS
).
Často potřebuji z localhostu posílat e-maily, když testuji nově napsanou aplikaci.
Pro tip:
Na Macu je situace jednoduchá, protože MAMP server nějak "zázračně" najde vždy aktuálně přihlášený účet do Apple Mailu a zprávy jsou posílány z aktuálního účtu.
Na toto chování se ale vždy nelze spolehnout a je dobré si zřídit vlastní řešení. Pokud máte k dispozici připojení k internetu a účet na Googlu, tak lze velice jednoduše použít účet na Gmailu, na který se lze přímo z PHP připojit a maily posílat přes něj.
Pokud používáte balík nette/mail
, tak je konfigurace jednoduchá:
mail:
smtp: true
host: smtp.gmail.com
username: janbarasek@gmail.com
password: *********
secure: ssl
Heslo není přihlašovací heslo k vašemu účtu (to by bylo nebezpečné a nešlo by použít například dvoufázové ověření).
Je potřeba použít tzv. "heslo aplikace", což implementačně znamená, že si přímo v Google účtu zaregistrujete vaši aplikaci, které se přidělí nějaké náhodně vygenerované heslo, které zadáte do PHP a bude přes něj možno odesílat.
Podrobný návod je na stránkách Googlu.
Prostřednictvím hostingu Wedos můžete denně odeslat jen 500 mailů a s připojením na SMTP jsem chvíli zápasil.
Prostřednictvím balíku nette/mail
se to dělá takto (funkční řešení):
mail:
smtp: true
host: smtp-*******.wedos.net
username: jan@barasek.com
password: ******
secure: tls
port: 587
Parametr host
má každý hosting jiný a dá se dohledat v mailu, který Wedos posílá při registraci hostingu.
username
představuje e-mailovou schránku, z které se budou maily odesílat. Schránka musí existovat. Při odeslání mailu v PHP musíme také nastavit odesilatete na tu samou adresu (v Nette metodou ->setFrom()
).
Pokud konfiguraci nevyplníme přesně a správně, budou vyhazovány různé chybové hlášky a maily nebude možné odeslat.
Po překročení počtu odeslaných zpráv se začne vyhazovat výjimka informující o překročení limitu.