La funzione integrata mail() di PHP passa i messaggi al binario sendmail locale senza autenticazione SMTP, senza negoziazione TLS e senza una segnalazione strutturata degli errori. PHPMailer aggiunge alle applicazioni PHP un client SMTP, la formattazione MIME e il supporto per gli allegati.
Come si installa PHPMailer?
Usa Composer:
composer require phpmailer/phpmailer
Poi carica l'autoloader e importa le classi necessarie:
<?php
require "vendor/autoload.php";
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
Come si configura SMTP e si invia un messaggio?
Crea un'istanza di PHPMailer, attiva la modalità SMTP con isSMTP(), poi imposta i campi di connessione e messaggio. Racchiudi la chiamata in un try/catch così un invio fallito viene segnalato invece che ignorato:
<?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}";
}
Fai corrispondere SMTPSecure alla porta del tuo server: ENCRYPTION_STARTTLS sulla porta 587 porta una connessione in chiaro a TLS, mentre ENCRYPTION_SMTPS sulla porta 465 negozia TLS fin da subito. Impostare isHTML(true) indica che Body è HTML e include AltBody come parte in testo semplice per i client che non visualizzano l'HTML. Includere entrambe le parti migliora anche la deliverability. Se passi true al costruttore, in caso di errore viene lanciata un'eccezione Exception invece di restituire false.
Come si aggiunge un allegato?
Chiama addAttachment con un percorso file prima di send():
<?php
$mail->addAttachment("./invoices/invoice-1042.pdf", "invoice.pdf");
Il secondo argomento rinomina il file come lo vede il destinatario. Puoi chiamarlo più volte per allegati multipli.
Invialo con Bird
Per inviare email da PHP tramite HTTPS senza gestire una connessione SMTP, installa l'SDK PHP di Bird (composer require messagebird/sdk) e chiama $bird->email->send():
<?php
use MessageBird\Bird;
$bird = new Bird(apiKey: getenv("BIRD_API_KEY"));
$message = $bird->email->send(
from: "onboarding@messagebird.dev",
to: ["delivered@messagebird.dev"],
subject: "Hello from PHP",
html: "<p>It works.</p>",
);
echo $message->getId(), " ", $message->getStatus(), "\n";
Il mittente onboarding@messagebird.dev e il destinatario sandbox delivered@messagebird.dev ti permettono di verificare la chiave API e il payload prima di configurare un dominio personalizzato.