Już raz wykonywaliśmy wysyłanie e-maili w PHP za pomocą natywnej funkcji mail(). W artykule pod tytułem Wysyłanie e-mail za pomocą PHP, jest cała instrukcja najprostszego sposobu na przesłanie wiadomości e-mail. Może to być wiadomość z formularza kontaktowego znajdującego się na stronie lub powiadomienie z aplikacji PHP.
Wypisaliśmy też zalety i wady tej prostszej metody, która przypomnijmy nie wymaga uwierzytelniania. Jedną z wad było to, że funkcja ta może zwyczajnie nie działać na niektórych hostingach. Jednym z możliwych rozwiązań jest wykorzystanie uwierzytelniania SMTP.
Wysyłanie e-maila to krytyczna funkcjonalność wielu aplikacji a nawet zwykłej strony. Z wykorzystaniem mechanizmu e-mail możemy stworzyć własny i niezależny newsletter, system powiadomień, formularz kontaktowy, helpdesk lub inne podobne rozwiązania.
E-mail z SMTP w PHP
SMTP (ang. Simple Mail Transfer Protocol) to protokół komunikacyjny, opisany w dokumencie RFC 821 i RFC 5321, który umożliwia przekazywanie wiadomości e-mail w Internecie.
Kiedy mówimy o SMTP w kontekście wysyłania e-maili w aplikacji PHP oznacza to, że przeciwnie do wysyłania wiadomości za pomocą funkcji mail(), która nota bene nie wymagała jakiejkolwiek autoryzacji istniejącego konta e-mail, teraz będziemy musieli zalogować się na istniejące konto e-mail i z tego konta wysyłać wiadomość jaką chcemy wysłać w aplikacji.
Wbrew pozorom nie jest to trudne. Z pomocą przychodzi gotowa biblioteka, która całą „brudną robotę” zrobi za nas a my jedynie dostarczymy niezbędnych zmiennych.
Pobieranie biblioteki PHPMailer na serwer
Aby móc wysłać e-mail z wykorzystaniem protokołu SMTP w aplikacji e-mail należy pobrać paczkę z tego repozytorium: https://github.com/PHPMailer/PHPMailer klikamy „Clone or download” rozpakowujemy i wysyłamy na serwer. PHPMailer powinien zadziałać na każdym serwerze. Możemy teraz zmienić nazwę głównego folderu na prostszą np. PHPMailer.
Zalety i możliwości biblioteki PHPMailer
- duża popularność, używany przez WordPress, Yii, Joomla! i wiele innych,
- zintegrowane wsparcie SMTP – z którego w tym artykule korzystamy,
- wysyłanie e-maili do wielu odbiorców na raz,
- alternatywne e-maile dla klientów pocztowych nieobsługujących HTML,
- łatwe dodawanie załączników,
- wsparcie dla kodowania utf-8,
- automatyczna walidacja adresu e-mail,
- zabezpieczenie przed atakiem header-injection,
- obsługa błędów w 50 jezykach,
Skrypt z wiadomością, loginem i hasłem SMTP
Skrypt który wyśle wiadomość wygląda tak:
require("PHPMailer/src/PHPMailer.php"); require("PHPMailer/src/SMTP.php"); require("PHPMailer/src/Exception.php"); $mail = new PHPMailer\PHPMailer\PHPMailer(); $mail->IsSMTP(); $mail->CharSet="UTF-8"; $mail->Host = "ssl0.ovh.net"; /* Zależne od hostingu poczty*/ $mail->SMTPDebug = 1; $mail->Port = 465 ; /* Zależne od hostingu poczty, czasem 587 */ $mail->SMTPSecure = 'ssl'; /* Jeżeli ma być aktywne szyfrowanie SSL */ $mail->SMTPAuth = true; $mail->IsHTML(true); $mail->Username = "nadawca@poczta.pl"; /* login do skrzynki email często adres*/ $mail->Password = "haslodopoczty"; /* Hasło do poczty */ $mail->setFrom('nadawca@poczta.pl', 'Pawel Mansfeld'); /* adres e-mail i nazwa nadawcy */ $mail->AddAddress("pawel@pawel.pl"); /* adres lub adresy odbiorców */ $mail->Subject = "Testowa wiadomość SMTP"; /* Tytuł wiadomości */ $mail->Body = "Witaj, Jeżeli to czytasz, to znaczy, że udało się poprawnie wysłać e-maila za pomocą SMTP!"; if(!$mail->Send()) { echo "Błąd wysyłania e-maila: " . $mail->ErrorInfo; } else { echo "Wiadomość została wysłana!"; }
Tak jak widać, pola:
- Host,
- Port,
- Username,
- Password,
- setFrom,
- AddAddress,
należy dostosować do własnej poczty i adresata. Dane takie jak host, port, łatwo zdobyć szukając informacji na temat konfiguracji danego konta e-mail w aplikacjach do obsługi poczty danej platformy a login i hasło to te same dane których używamy do logowanie się do tej konkretnej skrzynki.
Jeżeli wysyłanie e-maili działa, możemy śmiało zmienić pole SMTPDebug na 0. Wtedy skrypt nie będzie wyświetlał szczegółów.
Załącznik w e-mailu SMTP w PHP
We wspomnianym już wcześniej artykule na temat natywnej funkcji mail() dodanie załącznik wiązało się z dodaniem do skryptu skomplikowanych instrukcji i nagłówków. Jak jest w przypadku SMTP? Wystarczy dodać jedną linijkę kodu:
$file_to_attach = 'pliki/photo.jpg'; $mail->AddAttachment($file_to_attach , 'photo.jpg');
Co jeśli chcemy wysłać drugi załącznik? Nic prostszego, wystarczy jeszcze raz wywołać metodę AddAttachment.
Jeżeli nie rozumiesz dlaczego tutaj pojawiły się strzałki „->” zapraszam do artykułu: kurs obiektowego PHP.
PHPMailer STARTTLS na porcie 587
Niektóre konta e-mail wymagają szyfrowania STARTTLS i portu 587. Jeżeli twój dostawca e-mail dla poczty wychodzącej wymaga takich ustawień wystarczy zmienić pola Port i SMTPSecure:
$mail->Port = 587;
$mail->SMTPSecure = 'tls';
Nie zapomnij o zabezpieczeniu antyspamowym
Jeżeli integrujemy PHPMailer z formularzem kontaktowym nie zapomnij o wykonaniu zabezpieczenia antyspamowego. Najlepszym rozwiązaniem (zakładając, że nie tworzysz jakieś bardzo popularnej aplikacji) jest metoda Honeypot, którą opisałem w artykule o natywnej funkcji mail().
W dużym skrócie, dodajemy pole typu text o naturalnej nazwie np. „email”, które ukrywamy CSSem. Weryfikujemy czy pole zostało wypełnione, jeżeli tak to mamy pewność że e-maila wysyła robot i takie e-maile możemy odrzucać – np. kończąc skrypt funkcją die();
Kolejnym rozwiązaniem problemu SPAMu może być zabezpieczenie CAPTCHA. W jednym z artykułów opisałem proces integracji aplikacji PHP z reCAPTCHA. Czytaj jak zintegrować formularz w PHP z reCAPTCHA.
Podsumowanie
Jak widać, wysyłanie e-maila nawet z załącznikiem z wykorzystaniem protokołu SMTP jest proste. Wykorzystanie biblioteki gwarantuje możliwość wysłania wiadomości e-mail z dowolnego serwera, który obsługuje PHP.
Źródła
https://github.com/PHPMailer/PHPMailer/blob/master/README.md
Odpowiedz lub skomentuj