PHPMailer è forse la libreria PHP open source più popolare con cui inviare email. È stata rilasciata per la prima volta nel 2001 e da allora è diventata la più usata dagli sviluppatori PHP per la spedizione di messaggi di posta elettronica attraverso applicazioni PHP.
In questo tutorial parleremo dei motivi per cui preferire PHPMailer alla funzione mail()
del linguaggio e mostreremo alcuni esempi di codice su come utilizzare questa libreria.
Indice dei contenuti
Il linguaggio mette a disposizione nativamente un modo per spedire email, la funzione mail()
mail($recipient, $subject, $message, $headers)
Il suo funzionamento è molto semplice: una volta richiamata all'interno della nostra applicazione PHP, la funzione "contatterà" il sistema di invio email del nostro server (sendmail o SMTP) chiedendogli di spedire una email con oggetto $subject
e corpo $message
all'indirizzo di posta elettronica $recipient
. La funzione restituisce true
in caso di successo, false
altrimenti.
Il parametro $headers
può essere un array oppure una stringa e contiene gli headers (intestazioni), una serie di informazioni aggiuntive molto importanti. Senza queste informazioni infatti il messaggio inviato ha un'alta probabilità di finire nella cartella di posta indesiderata del destinatario.
Alcuni headers utilizzati sono:
From
: nome ed indirizzo email del mittenteReply-To
: indirizzo email per inviare una rispostaX-Mailer
: software del mittente utilizzato per l'invioRispetto alla funzione mail()
, la libreria PHPMailer offre allo sviluppatore una serie di vantaggi:
mail()
invece si deve usare il server di posta locale, la cui configurazione richiede tempo e competenze.È possibile installare PHPMailer tramite il gestore di pacchetti PHP Composer
composer require phpmailer/phpmailer
In alternativa, se non si usa Composer, è possibile scaricare PHPMailer, quindi scompattare l'archivio e copiare il contenuto della cartella PHPMailer nella directory di lavoro in base alla configurazione della propria applicazione e includere manualmente ciascun file della libreria.
Vediamo un esempio di utilizzo di PHPMailer utilizzando l'autenticazione SMTP. SMTP è un protocollo di comunicazione utilizzato dai client di posta per inviare una richiesta di invio email a un server di posta. Dopo che il server di posta ha verificato l'esistenza dell'indirizzo email, invia l'email con l'oggetto, il corpo ed eventuali allegati al server di posta destinatario.
Il nostro esempio di codice assume che i file della libreria stiano dentro una cartella chiamata "phpmailer", tramite il costrutto require li richiamiamo dentro il nostro script:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'phpmailer/src/Exception.php';
require 'phpmailer/src/PHPMailer.php';
require 'phpmailer/src/SMTP.php';
$mail = new PHPMailer(true); //se true vengono sollevate eventuali eccezioni utili per il debugging
try {
//Impostazioni server
$mail->SMTPDebug = SMTP::DEBUG_SERVER; //Debug mode
$mail->isSMTP(); //Invio tramite SMTP
$mail->Host = 'smtp.gmail.com'; //Server SMTP
$mail->SMTPAuth = true; //Abilita autenticazione SMTP
$mail->Username = 'user@gmail.com'; //SMTP username
$mail->Password = 'secret_password'; //SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; //Abilita TLS implicito
$mail->Port = 587; //Porta SMTP
//Recipients
$mail->setFrom('user@gmail.com', 'User');
$mail->addAddress('destinatario@gmail.com', 'Dest'); //Indirizzo destinatario
$mail->addReplyTo('user@gmail.com', 'User'); //Indirizzo di risposta
$mail->addCC('cc@gmail.com'); //Campo CC (Copia Carbone)
$mail->addBCC('bcc@gmail.com'); //Campo BCC (Copia Carbone Nascosta)
//Content
$mail->isHTML(true); //Abilita invio in HTML
$mail->Subject = 'Oggetto'; //Oggetto
$mail->Body = 'This is the HTML message body <b>in bold!</b>'; //Corpo email
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; //Testo alternativo
$mail->send();
echo 'Il messaggio è stato inviato con successo';
} catch (Exception $e) {
echo "Il messaggio non è stato inviato. Errore: {$mail->ErrorInfo}";
}
Affinché l'invio avvenga correttamente è necessario disporre di un account email abilitato all'invio di email (es. GMail, Outlook oppure l'email del tuo sito web) e configurare lo script nel seguente modo:
$mail->Host
rappresenta l'indirizzo del del server SMTP di posta da cui partiranno le email. Alcuni esempi: smtp.gmail.com nel caso di GMail oppure mail.dominio.tld dove dominio.tld è il sito internet dove gira lo script$mail->Username
è l'indirizzo email dell'account di posta elettronica che effettua l'autenticazione$mail->Password
è la password dell'account di posta elettronica$mail->Port
è il numero della porta utilizzata da SMTP (587 per TLS, 465 per SSL)Capita spesso di dover includere un allegato all'interno delle nostre email, con PHPMailer è possibile farlo in maniera semplice. Riprendiamo l'esempio precedente e aggiungiamo il codice necessario a includere un file da inviare come allegato:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'phpmailer/src/Exception.php';
require 'phpmailer/src/PHPMailer.php';
require 'phpmailer/src/SMTP.php';
$mail = new PHPMailer(true); //se true vengono sollevate eventuali eccezioni utili per il debugging
try {
//Impostazioni server
$mail->SMTPDebug = SMTP::DEBUG_SERVER; //Debug mode
$mail->isSMTP(); //Invio tramite SMTP
$mail->Host = 'smtp.gmail.com'; //Server SMTP
$mail->SMTPAuth = true; //Abilita autenticazione SMTP
$mail->Username = 'user@gmail.com'; //SMTP username
$mail->Password = 'secret_password'; //SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; //Abilita TLS implicito
$mail->Port = 587; //Porta SMTP
//Recipients
$mail->setFrom('user@gmail.com', 'User');
$mail->addAddress('destinatario@gmail.com', 'Dest'); //Indirizzo destinatario
$mail->addReplyTo('user@gmail.com', 'User'); //Indirizzo di risposta
$mail->addCC('cc@gmail.com'); //Campo CC (Copia Carbone)
$mail->addBCC('bcc@gmail.com'); //Campo BCC (Copia Carbone Nascosta)
//Allegati
$mail->addAttachment('allegati/allegato1.pdf'); //Allegato
//Content
$mail->isHTML(true); //Abilita invio in HTML
$mail->Subject = 'Oggetto'; //Oggetto
$mail->Body = 'This is the HTML message body in bold!'; //Corpo email
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; //Testo alternativo
$mail->send();
echo 'Il messaggio è stato inviato con successo';
} catch (Exception $e) {
echo "Il messaggio non è stato inviato. Errore: {$mail->ErrorInfo}";
}
Il metodo $mail->addAttachment()
consente di includere allegati alla nostra email. È sufficiente indicare il percorso al file da includere.
Nel nostro esempio la riga di codice
$mail->addAttachment('allegati/allegato1.pdf');
consente di allegare alla nostra email il file allegato1.pdf
contenuto nella directory "allegati"
.
Dentro $mail->ErrorInfo
troviamo eventuali messaggi di errori se qualcosa dovesse andare storto durante l'invio. È possibile visualizzare il messaggio in una delle oltre 50 lingue supportate da PHPMailer.
Ad esempio, la seguente riga di codice
$mail->setLanguage("de");
consente di impostare i messaggi di errore in lingua tedesca.