PHP Manual
/
Zarządzanie serwerami produkcyjnymi

Wysyłanie e-maili (funkcje mail() i SMTP) w PHP

26. 11. 2019

Obsah článku

W PHP mamy zasadniczo dwa sposoby wysyłania wiadomości e-mail:

  • Rodzima funkcja mail(), która ma sporo ograniczeń,
  • lub za pośrednictwem serwera SMTP.

Funkcja mail() musi korzystać z serwera SMTP, co jest jedynym sposobem wysyłania poczty przez serwer SMTP.

Idea tego rozwiązania jest prosta: użytkownik wywołuje funkcję:

mail('jan@barasek.com', 'Temat:', 'Tekst wiadomości...');

A PHP samo zajmie się wysyłaniem.

Wewnętrznie, wysyłanie działa poprzez odczytanie konfiguracji z pliku php.ini i wyszukanie domyślnego serwera SMTP, przez który ma być dostarczona poczta. Wymaga to więc wcześniejszego skonfigurowania serwera WWW.

Główną wadą funkcji mail() jest to, że programista musi sam wymyślić całą logikę. Obejmuje to na przykład usuwanie nagłówków dotyczących szyfrowania, łączenie certyfikatów z szyfrowaniem wiadomości itd.

W przypadku niepowodzenia wysyłania zwracana jest wartość false, którą musimy przechwycić i przetworzyć samodzielnie. Możemy dowiedzieć się o konkretnym błędzie w ograniczony sposób, wywołując error_get_last(), na przykład:

if (@mail($to, $subject, $message) === false) {
throw new \Exception(
'Nie można wysłać poczty:'
. (@error_get_last()['wiadomość'] ?? '')
);
}

TIP: Zwróć uwagę, że nie podaliśmy adresu, z którego chcemy wysłać pocztę, ani kodowania, które ma zostać użyte.

Wszystkie te ustawienia muszą być przekazywane za pomocą nagłówków.

Jeśli nadal musisz używać funkcji mail() (na przykład z powodu hostingu), polecam użycie pakietu nette/mail i usługi SendmailMailer, która dobrze radzi sobie z wysyłaniem poczty.

Serwer SMTP

Skrót SMTP oznacza Simple Mail Transfer Protocol, co (jak się wkrótce przekonasz) jest bardzo prawdziwe.

SMTP, w przeciwieństwie do mail(), jest bardziej zaawansowanym protokołem, posiadającym zaawansowane opcje konfiguracyjne nie tylko po stronie PHP, ale także bezpośrednio na serwerze pocztowym.

Obsługa protokołu SMTP na hostach jest w 2018 roku doskonała.

SMTP zasadniczo działa w ten sposób, że PHP najpierw nawiązuje połączenie z serwerem SMTP (wymaga to rozszerzenia php_openssl.dll w PHP, które prawdopodobnie masz już aktywne), uwierzytelnia się (weryfikuje poprawność danych logowania) podczas połączenia, a następnie możemy komunikować się z serwerem w podobny sposób jak z bazą danych - tzn. wysyłać pojedyncze żądania, ale cały czas utrzymywać jedno połączenie. Dużą zaletą protokołu SMTP jest bezpośrednia obsługa szyfrowania (znanego jako TLS).

Wysyłanie wiadomości e-mail z localhost - proste rozwiązanie

Często muszę wysyłać wiadomości e-mail z localhost, gdy testuję nowo napisaną aplikację.

Dla napiwku:

Na komputerach Mac sytuacja jest prosta, ponieważ serwer MAMP w jakiś "magiczny" sposób znajduje aktualnie zalogowane konto Apple Mail i wiadomości są zawsze wysyłane z tego konta.

Nie zawsze jednak można polegać na takim zachowaniu i warto opracować własne rozwiązanie. Jeśli masz połączenie z Internetem i konto Google, możesz w bardzo prosty sposób korzystać z konta Gmail, z którym możesz łączyć się bezpośrednio z PHP i wysyłać za jego pośrednictwem pocztę.

Jeśli używasz pakietu nette/mail, konfiguracja jest prosta:

mail:
smtp: true
host: smtp.gmail.com
username: janbarasek@gmail.com
password: *********
secure: ssl

Hasło nie jest hasłem logowania do konta (byłoby to niezabezpieczone i nie można by na przykład używać dwuskładnikowego uwierzytelniania).

Musisz użyć tak zwanego "hasła aplikacji", co w praktyce oznacza, że rejestrujesz swoją aplikację bezpośrednio na swoim koncie Google, do którego przypisane jest jakieś losowo wygenerowane hasło, które wprowadzasz do PHP i przez które można ją wysłać.

Szczegółowe instrukcje znajdują się w witrynie Google.

Konfiguracja poczty na Wedosie

Za pośrednictwem hostingu Wedos można wysłać tylko 500 e-maili dziennie, a ja przez pewien czas zmagałem się z połączeniem SMTP.

Za pośrednictwem pakietu nette/mail można to zrobić w następujący sposób (rozwiązanie możliwe do zastosowania):

mail:
smtp: true
host: smtp-*******.wedos.net
username: jan@barasek.com
password: ******
secure: tls
port: 587

Parametr host jest inny dla każdego hostingu i można go znaleźć w e-mailu, który Wedos wysyła przy rejestracji hostingu.

Nazwa username reprezentuje skrzynkę pocztową, z której będą wysyłane maile. Skrzynka pocztowa musi istnieć. Wysyłając pocztę w PHP, musimy również ustawić wysyłkę na ten sam adres (w Nette za pomocą metody ->setFrom()).

Jeśli nie wypełnimy konfiguracji dokładnie i poprawnie, zostaną wyświetlone różne komunikaty o błędach i nie będzie można wysyłać wiadomości pocztowych.

Po przekroczeniu liczby wysłanych wiadomości zostanie rzucony wyjątek informujący o przekroczeniu 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:

Související články

1.
2.
Status:
All systems normal.
2024