Odesílání e-mailů (funkce mail() a SMTP)

V PHP máme v podstatě 2 možnosti, jak odesílat maily:

  • Nativní funkce mail(), která má relativně dost omezení,
  • nebo prostřednictvím SMTP serveru.

Funkce mail()

Myšlenka použití je jednoduchá: Zavoláte funkci:

1 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:

1 if (@mail($to, $subject, $message) === false) {
2     throw new \Exception(
3         'Can not send mail: '
4         . (@error_get_last()['message'] ?? '')
5     );
6 }

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 server

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).

Odesílání e-mailů z localhostu – jednoduché řešení

Často potřebuji z localhostu posílat e-maily, když testuji nově napsanou aplikaci.

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 (na adrese https://myaccount.google.com/apppasswords), 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: https://support.google.com/…nswer/185833?…

Konfigurace mailů na Wedosu

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.

Sponzorované odkazy
Pomohl Vám tento článek?