13 maja 2020

Wysyłanie e-mail z autoryzacją SMTP w PHP

Kategoria: Programowanie
Tagi: php,
Autor: Paweł Mansfeld

Wysyłanie e-mail z autoryzacją SMTP w PHP

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@mansfeld.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();

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

Oceń artykuł na temat: Wysyłanie e-mail z autoryzacją SMTP w PHP
Średnia : 4.7 , Maksymalnie : 5 , Głosów : 7


 

Odpowiedz lub skomentuj

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *


 

Wykryto brak połączenia z Internetem.