V 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: truehost: smtp.gmail.comusername: janbarasek@gmail.compassword: *********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: truehost: smtp-*******.wedos.netusername: jan@barasek.compassword: ******secure: tlsport: 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.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Nabízím trénink vývojářů, konzultace, školení a analýzu návrhových vzorů. Osobně v Praze nebo online.
Napište mi, pokud si nevíte rady.
Lektor: Jan Barášek
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | cs