W prawdzie w niektórych projektach PHP korzystam z systemowej funkcji mail() – choć zazwyczaj odpowiada za nią MSMTP – to najczęściej korzystam z dodatkowych bibliotek/klas i zewnętrznych serwerów SMTP. Jedną z nich jest PHPMailer – i dziś będzie jak w prosty sposób wysłać ze strony w PHP wiadomość e-mail za pośrednictwem tej biblioteki…
Spis treści w artykule
PHPMailer
PHPMailer to skrypt biblioteka do wysyłania wiadomości e-mail z PHP, dzięki której możecie korzystać z zewnętrznych serwerów SMTP – niezależnie od tego, jak jest ustawiony system (hosting) na którym macie stronę.
Przedstawię 2 przykładowe (modelowe) konfiguracje, oparte na 2 rozwiązaniach/zewnętrznych serwerach SMTP:
- Gmail – bo pewnie sporo z Was korzysta z tej poczty
- Mandrill – naprawdę dobre (i tanie) rozwiązanie do wysyłki większej ilości wiadomości
Oczywiście będzie to właściwie najprostsza możliwa działająca konfiguracja, którą musicie dopasować do własnych potrzeb – choćby wstawiając odpowiednie wartości zamiast nadawcy, odbiorcy czy treści.
Nowa wersja PHPMailer
Zanim przedstawię konfigurację PHPMailer dla Gmaila i usługi Mandrill jeszcze 2 małe uwagi, przydatne zwłaszcza dla osób które przesiądą się na nową wersję biblioteki z jakiejś starszej – tak jak chwilę temu ja u znajomego.
Kodowanie znaków
Przed aktualizacją kodowanie znaków w wysyłanych wiadomościach było OK, po aktualizacji zamiast polskich znaków przychodziły krzaki.
Pomogło dodanie linijki:
$mail->CharSet = "UTF-8";
Tuż za:
$mail = new PHPMailer;
Plik „ładowania biblioteki”
Kolejna niespodzianka jaka może Was po aktualizacji spotkać, to konieczność zmiany pliku biblioteki, który należy załadować do skryptu PHP.
Kiedyś było to:
require_once('phpmailer/class.phpmailer.php');
Teraz jest Było, bo w nowej wersji znowu nastąpiły zmiany (o tym dalej/niżej):
require_once('phpmailer/PHPMailerAutoload.php');
OK, możemy zaczynać właściwą część wpisu/poradnika, czyli 2 skrypty:
PHPMailer i Gmail
<?php
require_once('phpmailer/PHPMailerAutoload.php'); # patch where is PHPMailer / ścieżka do PHPMailera
$mail = new PHPMailer;
$mail->CharSet = "UTF-8";
$mail->IsSMTP();
$mail->Host = 'smtp.gmail.com'; # Gmail SMTP host
$mail->Port = 465; # Gmail SMTP port
$mail->SMTPAuth = true; # Enable SMTP authentication / Autoryzacja SMTP
$mail->Username = "[email protected]"; # Gmail username (e-mail) / Nazwa użytkownika
$mail->Password = "GMAIL PASSWORD"; # Gmail password / Hasło użytkownika
$mail->SMTPSecure = 'ssl';
#$mail->From = ''; # REM: Gmail put Your e-mail here
$mail->FromName = 'You name'; # Sender name
$mail->AddAddress('send_to@adress', 'Name'); # # Recipient (e-mail address + name) / Odbiorca (adres e-mail i nazwa)
$mail->IsHTML(true); # Email @ HTML
$mail->Subject = 'E-mail subject / Tytuł wiadomości';
$mail->Body = 'HTML e-mail body / Treść wiadomości w HTML';
$mail->AltBody = 'Plaint text e-mail body / Treść wiadomości jako tekst';
if(!$mail->Send()) {
echo 'Some error... / Jakiś błąd...';
echo 'Mailer Error: ' . $mail->ErrorInfo;
exit;
}
echo 'Message has been sent (OK) / Wiadomość wysłana (OK)';
?>
PHPMailer i Mandrill
<?php
require_once('phpmailer/PHPMailerAutoload.php'); # patch where is PHPMailer / ścieżka do PHPMailera
$mail = new PHPMailer;
$mail->CharSet = "UTF-8";
$mail->IsSMTP();
$mail->Host = 'smtp.mandrillapp.com'; # Mandrill SMTP host / Adres SMTP Mandrill
$mail->Port = 587; # Mandrill SMTP port
$mail->SMTPAuth = true; # Enable SMTP authentication / Autoryzacja SMTP
$mail->Username = "ACCOUNT E_MAIL"; # Mandrill username / Nazwa użytkownika Mandrill
$mail->Password = "API KEY"; # Mandrill API key / Klucz API
$mail->SMTPSecure = 'tls';
$mail->From = '[email protected]'; # Sender address / Adres nadawcy
$mail->FromName = 'You name'; # Sender name / Nazwa nadawcy
$mail->AddAddress('send_to@adress', 'Name'); # Recipient (e-mail address + name) / Odbiorca (adres e-mail i nazwa)
$mail->IsHTML(true); # Email @ HTML
$mail->Subject = 'E-mail subject / Tytuł wiadomości';
$mail->Body = 'HTML e-mail body / Treść wiadomości w HTML';
$mail->AltBody = 'Plaint text e-mail body / Treść wiadomości jako tekst';
if(!$mail->Send()) {
echo 'Some error... / Jakiś błąd...';
echo 'Mailer Error: ' . $mail->ErrorInfo;
exit;
}
echo 'Message has been sent (OK) / Wiadomośś wysłana (OK)';
?>
Pamiętajcie, by uzupełnić skrypty o Waszą nazwę użytkownika i hasło… ;-)
[Aktualizacja 2016.11.13]
PHPMailer 6+
W najnowszej wersji PhpMailer (6+) znowu nastąpiła zmiana, i jeśli korzystacie z wersji aktualizowanej z GitHuba, bez używania „composera” (jak ja), to początek pliku – zamiast „require_once” – powinien wyglądać tak:
header('Content-type: text/html; charset=utf-8');
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'phpmailer/src/Exception.php';
require 'phpmailer/src/PHPMailer.php';
require 'phpmailer/src/SMTP.php';
Do tego kilka innych zmian, stąd obecnie przykładowy skrypt może wyglądać tak:
<?php
header('Content-type: text/html; charset=utf-8');
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'phpmailer/src/Exception.php';
require 'phpmailer/src/PHPMailer.php';
require 'phpmailer/src/SMTP.php';
$imie = $_POST['webinsider-input-imie'];
$email = $_POST['webinsider-input-email'];
$tresc = $_POST['webinsider-input-tresc'];
$temat = $_POST['webinsider-input-temat'];
date_default_timezone_set('Europe/Warsaw');
$mail = new PHPMailer(true);
try {
$mail->isSMTP(); // Używamy SMTP
$mail->Host = 'smtp.serwerpocztowy.pl'; // Adres serwera SMTP
$mail->SMTPAuth = true; // Autoryzacja (do) SMTP
$mail->Username = "UŻYTKOWNIK"; // Nazwa użytkownika
$mail->Password = "HASŁO"; // Hasło
$mail->SMTPSecure = 'tls'; // Typ szyfrowania (TLS/SSL)
$mail->Port = 587; // Port
$mail->CharSet = "UTF-8";
$mail->setLanguage('pl', '/phpmailer/language');
$mail->setFrom('adres-email@nadawcy-wiadomości.pl', 'Webinsider.pl');
$mail->addAddress('adres-email@odbiorcy-wiadomości.pl', 'Patryk');
$mail->addReplyTo($email, $imie);
$mail->isHTML(true); // Format: HTML
$mail->Subject = $temat;
$mail->Body = $tresc;
$mail->AltBody = 'By wyświetlić wiadomość należy skorzystać z czytnika obsługującego wiadomości w formie HTML';
$mail->send();
// Gdy OK:
header("Location: https://webinsider.pl/?email=1");
} catch (Exception $e) {
// Gdy błąd:
header("Location: https://webinsider.pl/?email=0");
}
?>
Zmiana dość spora, zwłaszcza „zniknięcie” pliku „PHPMailerAutoload.php”, co oczywiście skutkuje tym, że starszy skrypt przestaje wysyłać wiadomości. Niestety, taki urok korzystania z zewnętrznych bibliotek, że czasem zmiany są dość radykalne. Coś za coś…
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
brakuje
$mail->Host = 'ssl://smtp.gmail.com’; # Gmail SMTP host
Wiesz co, sprawdzę to później, ale przykładowe konfigi podawałem na swoim przykładzie, gdzie to działa(ło). Wprawdzie było to w 2015, ale niedawno zaktualizowałem wpis o przykładową konfigurację PHPMailer w nowej wersji, bo trochę się zmieniło.
Co do „SSL”, to chyba tu „wystarczy(ło)” dać:
Bez "komplikowania" samego adresu hosta SMTP.
Z tym skryptem jest taki mały error logiczny, bo działa on poprawnie jeżeli używamy go np. do rejestracji użytkownika, gdzie email jest wysyłany na podany w formularzu email.
Jeżeli chcemy np. użyć go w formularzu kontaktowym, na własnej stronie, wtedy pole OD: jest wypełnione „naszym” adresem email tj. tym ze strony (email administrator itd), a dokładnie to we funkcji $mail->setFrom należy ustawić $mail->Username, bo inaczej dostaje SMTP authentication error lub inne.
Ale to jest nie logiczne, bo jeżeli ktoś wysyła wiadomość (do kogoś), to w polu OD: powinny być dane nadawcy, żeby mógł do niego odpowiedzieć.
Tak jak wspomniałem na początku, jeżeli używamy go do rejestracji użytkownika na stronie i email leci do użytkownika (który to się rejestruje) jest wszystko ok, ale w przypadku formularza kontaktowego już jest problem, bo żeby wysyłka działa to muszę ustawić poprawny adres: Receip, ale wtedy pole Od: to mój adres emai i jak otrzymam emaila i chce odpowiedzieć, to odpowiadam do siebie, nie do nadawcy!
:D
Zgadzam się z Tobą w wielu miejscach, ale odpowiedzią na to będzie to co piszesz – wszystko kwestia tego, do czego nam formularz potrzebny. Teraz nie pamiętam, ale bardzo możliwe, że kod użyty w artykule bazuje na jakimś przykładzie z dokumentacji narzędzia. W każdym razie – zawsze można dopasować go, zależnie od potrzeb (i przeznaczenia).
Natomiast nie mogę zgodzić się z tym fragmentem:
Jest to najprostsza metoda do bana na serwer SMTP, lub na usługę typu SparkPost. W polu „od” zalecam wpisać adres należący do nas (ew. w zweryfikowanej, należącej do nas domenie), a adres nadawcy wiadomości ew wstawiać jako „odpowiedz do”.
Miałem problem z uruchomieniem PHPMailer-a, ale dzięki Tobie już wszystko działa. Dzięki!
To dobrze, zwłaszcza że to faktycznie jedno z najlepszych tego typu rozwiązań… :-)