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…

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ś…

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk