PHPMailer to najszerzej stosowana biblioteka do wysyłania e-maili z PHP. Opakowuje SMTP, więc konfigurujesz hosta, port i dane uwierzytelniające raz, a potem budujesz i wysyłasz wiadomości za pomocą przejrzystego obiektowego API. Wbudowana w PHP funkcja mail() robi za mało (brak uwierzytelniania, słabe raportowanie błędów), dlatego większość projektów sięga po PHPMailer. Oto kompletny, działający przykład wysyłki.
Jak zainstalować PHPMailer?
Użyj Composera:
composer require phpmailer/phpmailer
Następnie załaduj autoloader i zaimportuj potrzebne klasy:
<?php
require "vendor/autoload.php";
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
Jak skonfigurować SMTP i wysłać wiadomość?
Utwórz instancję PHPMailer, przełącz ją w tryb SMTP za pomocą isSMTP(), a potem ustaw pola połączenia i wiadomości. Opakuj wywołanie w try/catch, żeby nieudana wysyłka została zgłoszona, a nie pominięta:
<?php
$mail = new PHPMailer(true); // true enables exceptions
try {
// Server settings
$mail->isSMTP();
$mail->Host = "smtp.example.com";
$mail->SMTPAuth = true;
$mail->Username = getenv("SMTP_USER");
$mail->Password = getenv("SMTP_PASS");
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// Recipients
$mail->setFrom("you@yourdomain.com", "Your App");
$mail->addAddress("recipient@example.org", "Recipient Name");
// Content
$mail->isHTML(true);
$mail->Subject = "Your receipt";
$mail->Body = "<p>Thanks for your order.</p>";
$mail->AltBody = "Thanks for your order. This is the plain-text version.";
$mail->send();
echo "Message sent.";
} catch (Exception $e) {
echo "Send failed: {$mail->ErrorInfo}";
}
Kilka szczegółów, które sprawiają problemy. SMTPSecure i Port idą w parze: użyj ENCRYPTION_STARTTLS z portem 587 albo ENCRYPTION_SMTPS z portem 465. isHTML(true) mówi PHPMailer, że Body to HTML, i wysyła AltBody jako alternatywę tekstową. Przekaż true do konstruktora, żeby błędy rzucały Exception zamiast po cichu zwracać false.
Jak dodać załącznik?
Wywołaj addAttachment ze ścieżką do pliku przed send():
<?php
$mail->addAttachment("./invoices/invoice-1042.pdf", "invoice.pdf");
Drugi argument zmienia nazwę pliku widoczną dla odbiorcy. Możesz wywołać tę metodę wielokrotnie, aby dodać wiele załączników.
Wyślij za pomocą Bird
PHPMailer komunikuje się przez SMTP, co oznacza, że na produkcji potrzebujesz serwera pocztowego z czystą reputacją, poprawnymi rekordami uwierzytelniania i miejscem, w którym zobaczysz, co się stało po wysyłce. HTTP API eliminuje serwer. Wysyłasz JSON przez HTTPS i dostajesz ustrukturyzowaną odpowiedź. Dzięki Bird email API ta sama wiadomość to jedno wywołanie:
use Bird\Bird;
$bird = new Bird(getenv("BIRD_API_KEY"));
$bird->emails->send([
"from" => "you@yourdomain.com",
"to" => "delivered@bird.dev",
"subject" => "Hello from PHP",
"html" => "<p>It works.</p>",
]);
Adres sandboxowy delivered@bird.dev zawsze przyjmuje pocztę, więc możesz zweryfikować integrację, zanim zaczniesz wysyłać do prawdziwych skrzynek. Żadnego gniazda SMTP, żadnego wyboru portu, żadnej reputacji do rozgrzewania.
FAQ
Dlaczego nie używać po prostu funkcji mail() w PHP?
mail() przekazuje wiadomość do lokalnego pliku binarnego sendmail bez uwierzytelniania SMTP i prawie bez raportowania błędów. PHPMailer uwierzytelnia się na zdalnym serwerze, obsługuje TLS, buduje wiadomości wieloczęściowe i informuje, dlaczego wysyłka się nie powiodła.
Jaka jest różnica między Body a AltBody?
Body to wersja HTML, a AltBody to zapasowa wersja tekstowa. Gdy ustawisz isHTML(true), klienty, które nie renderują HTML, wyświetlają AltBody, co pomaga też w dostarczalności.
STARTTLS czy SMTPS?
ENCRYPTION_STARTTLS na porcie 587 podnosi zwykłe połączenie do TLS, a ENCRYPTION_SMTPS na porcie 465 szyfruje od samego początku. Dopasuj ustawienie do portu, którego oczekuje Twój serwer pocztowy.
PHPMailer to właściwe narzędzie, gdy chcesz wysyłać przez SMTP z PHP. Jeśli wolisz pominąć zarządzanie serwerem, przewodnik po wysyłaniu e-maili pokazuje pełną ścieżkę API.