Inviare mail in PHP con PHPMailer

In questo articolo parleremo del motivo per cui dovresti usare PHPMailer invece della funzione mail() di PHP e mostreremo alcuni esempi di codice su come usare questa libreria.

È un’alternativa alla funzione mail() di PHP?

Nella maggior parte dei casi, è un’alternativa alla funzione mail() di PHP, ma ci sono molti altri casi in cui la funzione mail() semplicemente non è sufficientemente flessibile per ottenere ciò di cui hai bisogno.

Inanzitutto PHPMailer, a differenza di mail() fornisce un’interfaccia orientata agli oggetti. Semplifica di molto la creazione di stringhe $headers durante l’invio di e-mail. Evita di dover scrivere codice sporco (caratteri di escape, codifica e formattazione) per inviare allegati ed e-mail basate su HTML.

Inoltre, la funzione mail() richiede un server di posta locale per inviare e-mail, il che non è affatto semplice da configurare. PHPMailer può utilizzare un server di posta non locale (SMTP).

Ulteriori vantaggi includono:

  • La possibilità di stampare vari tipi di messaggi di errore in più di 40 lingue quando non riesce a inviare un’e-mail.
  • Il supporto del protocollo SMTP e l’autenticazione su SSL e TLS.
  • La possibilità di inviare una versione alternativa plain-text per client di posta elettronica non HTML.
  • Una comunità di sviluppatori molto attiva che lo mantiene sicuro e aggiornato.

PHPMailer è utilizzato anche dai più diffusi sistemi di gestione dei contenuti PHP come WordPress, Drupal e Joomla.

Installare PHPMailer

Si può installare PHPMailer tramite composer:

composer require phpmailer/phpmailer

Oppure scaricandolo direttamente dalla repository github ufficiale:

https://github.com/PHPMailer/PHPMailer

Invio di e-mail da un server Web locale utilizzando PHPMailer

Ecco un semplice esempio di invio di un’e-mail da un server Web locale utilizzando PHPMailer:

<?php
use PHPMailer\\PHPMailer\\PHPMailer;
use PHPMailer\\PHPMailer\\Exception;

require_once "vendor/autoload.php";

//Oggetto PHPMailer
$mail = new PHPMailer(true); //Il valore true abilita la gestione delle eccezioni

//indirizzo mail e nome del mittente
$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";

//indirizzi mail destinatari
$mail->addAddress("recepient1@example.com", "Recepient Name");
$mail->addAddress("recepient1@example.com"); //il nome del destinario è opzionale

//indirizzo mail a cui rispondere
$mail->addReplyTo("reply@yourdomain.com", "Reply");

//Indirizzo mail in Copia Conoscenza
$mail->addCC("cc@example.com");
//Indirizzo mail in Copia Conoscenza Nascosta
$mail->addBCC("bcc@example.com");

//Invia la mail in formato HTML
$mail->isHTML(true);

//oggetto della mail
$mail->Subject = "Subject Text";
//Cordpo della mail
$mail->Body = "<i>Mail body in HTML</i>";
//Versione alternativa plain-text della mail
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Il messaggio è stato inviato con successo";
} catch (Exception $e) {
    echo "Errore: " . $mail->ErrorInfo;
}

Il codice e i commenti dovrebbero essere sufficientemente chiari per spiegare tutto quello che sta succedendo.

Invio di un’e-mail con allegati

Ecco un esempio di come inviare un’e-mail con allegati utilizzando PHPMailer:

<?php
use PHPMailer\\PHPMailer\\PHPMailer;
use PHPMailer\\PHPMailer\\Exception;

require_once "vendor/autoload.php";

$mail = new PHPMailer;

$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";

$mail->addAddress("recipient1@example.com", "Recipient Name");

//Inserisci il percorso e il nome del file da allegare
$mail->addAttachment("file.txt", "File.txt");        
$mail->addAttachment("images/profile.png"); //il nome del file è opzionale

$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Il messaggio è stato inviato con successo";
} catch (Exception $e) {
    echo "Errore: " . $mail->ErrorInfo;
}

Qui alleghiamo due file: file.txt, che risiede nella stessa cartella dello script, e images/profile.png, che risiede nella sotto-cartella images della cartella dello script.

Per aggiungere allegati all’e-mail, basta chiamare la funzione addAttachment dell’oggetto PHPMailer passando come argomento il percorso del file. Per allegare più file, basta chiamarlo più volte.

Utilizzo di SMTP

Puoi utilizzare il server di posta di un altro host per inviare e-mail, ma per questo è necessario avere i parametri necessari all’invio delle mail. Ad esempio, per inviare una mail dal server di posta di Gmail, devi disporre di un account Gmail e la relativa password.

SMTP è un protocollo utilizzato dai client di posta per inviare una mail tramite un server di posta. Il server di posta verifica l’e-mail e la spedisce al server di posta di destinazione.

Ecco un esempio di invio di una mail utilizzando il server di posta di Gmail. Non è necessario un server di posta locale per eseguire il codice. Useremo il protocollo SMTP:

<?php
use PHPMailer\\PHPMailer\\PHPMailer;
use PHPMailer\\PHPMailer\\SMTP;
use PHPMailer\\PHPMailer\\Exception;

require_once "vendor/autoload.php";

$mail = new PHPMailer(true);

//Abilita il debug. Il valore va da 0 (nessun messaggio) a 4
$mail->SMTPDebug = 3;                               
//Abilita l'utilizzo del protocollo SMTP.
$mail->isSMTP();            
//Server SMTP                         
$mail->Host = "smtp.gmail.com";
//Impostare a true se il server SMTP richiede l'autenticazione per inviare
$mail->SMTPAuth = true;                          
//Inserisci nome utente e la relativa password   
$mail->Username = "name@gmail.com";                 
$mail->Password = "super_secret_password";                           
//Impostare il tipo di crittografia richiesta dal server SMTP
$mail->SMTPSecure = "tls";                           
//Impostare la porta TCP di connessione
$mail->Port = 587;                                   

$mail->From = "name@gmail.com";
$mail->FromName = "Full Name";

$mail->addAddress("name@example.com", "Recepient Name");

$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Il messaggio è stato inviato con successo";
} catch (Exception $e) {
    echo "Errore: " . $mail->ErrorInfo;
}

Prima di inviare tramite SMTP, è necessario conoscere il nome host, il numero di porta, il tipo di crittografia (se richiesto) e le credenziali per l’autenticazione (se richiesta). Tieni presente che l’abilitazione dell’autenticazione a due fattori su Gmail non ti consentirà di utilizzare il loro SMTP con nome utente/password. Sarà invece necessaria una configurazione aggiuntiva.

Troubleshooting

Nei nostri esempi, abbiamo utilizzato la classe Exception di PHPMailer per il debug, che ci aiuta nel debug di qualsiasi errore venga generato. Abbiamo anche aggiunto l’argomento true al costruttore PHPMailer, per generare eccezioni di livello più alto e più descrittive.

A seconda del sistema che utilizziamo, probabilmente l’errore più frequente che vedremo sarà relativo all’esecuzione della funzione mail() in background:

Mailer Error: Could not instantiate mail function.

Se abbiamo bisogno di maggiori dettagli sull’errore, possiamo anche aggiungere qualcosa di simile alla clausola catch:

print_r(error_get_last());

Di solito, il problema con la funzione di posta sarà correlato alla configurazione del server di posta mancante, nel qual caso la funzione error_get_last restituirà qualcosa del genere:

Array (
    [type] => 2
    [message] => mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()
    [file] => OUR_PATH \\vendor\\phpmailer\\phpmailer\\src\\PHPMailer.php
    [line] => 863
)

Visualizzazione di messaggi di errore localizzati

$mail->ErrorInfo può restituire messaggi di errore in 43 lingue diverse.

Per visualizzare i messaggi di errore in una lingua diversa, copia la directory della lingua dal codice sorgente di PHPMailer nella directory del progetto.

Per restituire messaggi di errore in italiano, ad esempio, basta impostare l’oggetto PHPMailer sulla lingua italiana utilizzando la chiamata al metodo seguente:

$mail->setLanguage("it");

Puoi anche aggiungere i tuoi file di lingua alla directory language.

Conclusioni

Se sei uno sviluppatore PHP, ci sono poche possibilità di evitare di dover inviare e-mail in modo programmatico. Sebbene tu possa optare per servizi di terze parti come Mandrill o SendGrid, a volte questa non è un’opzione e ancora meno è possibile utilizzare la tua libreria di invio e-mail. È qui che entrano in gioco PHPMailer e le sue alternative (Zend Mail, Swift Mailer e così via).

Puoi conoscere le API di questa libreria nel wiki del repository o nella documentazione ufficiale.

Lascia un commento