Tutorial PHP

Come inviare email in PHP con PHPMailer

Come inviare email in PHP con PHPMailer

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.

Funzione mail()

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 mittente
  • Reply-To: indirizzo email per inviare una risposta
  • X-Mailer: software del mittente utilizzato per l'invio

PHPMailer e vantaggi

Rispetto alla funzione mail(), la libreria PHPMailer offre allo sviluppatore una serie di vantaggi:

  • Ha una comoda interfaccia orientata agli oggetti
  • È la libreria ad occuparsi della costruzione e formattazione corretta degli headers
  • Consente il debugging con diversi livelli di dettaglio di errore
  • Supporta il protocollo SMTP e l'invio delle email su connessione sicura tramite protocollo SSL/TLS
  • Ha il supporto multilingua (oltre 50 lingue)
  • Invia una versione alternativa di testo normale per i client di posta elettronica che non supportano HTML.
  • Ha una comunità di sviluppatori molto attiva che mantiene la libreria sicura e aggiornata.
  • Con PHPMailer è possibile usare un server di posta (SMTP) remoto tramite autenticazione con email e password, con la funzione mail() invece si deve usare il server di posta locale, la cui configurazione richiede tempo e competenze.

Installazione

È 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.

Invio email tramite SMTP

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:

  • riga 16: $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
  • riga 18: $mail->Username è l'indirizzo email dell'account di posta elettronica che effettua l'autenticazione
  • riga 19: $mail->Password è la password dell'account di posta elettronica
  • riga 21: $mail->Port è il numero della porta utilizzata da SMTP (587 per TLS, 465 per SSL)

Invio email con allegato

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".

Messaggi di errore

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.