ATTENZIONE: Questa pillola fa riferimento alla versione 2.0 di PHPMailer che non é più quella attuale. Verificate nella documentazione eventuali differenze (ad esempio gli argomenti passati dai metodi, i nomi dei metodi e delle proprietà).
Spesso mi capita di aiutare utenti di questo forum alle prese con problemi riguardo alla funzione mail. Per esperienza, il 90% di questi problemi si risolvono utilizzando la celebre classe PHPmailer. Questa classe ci permette di inviare email con grande semplicità ed eleganza non dovendoci curare, ad esempio, di quel campo minato che sono gli headers. Ho pensato di scrivere questa pillola in particolare per gli utenti meno esperti, ai quali viene consigliato sempre di utilizzare questa classe, ma che potrebbero farsi intimorire dalla sintassi “ad oggetti”. Ho quindi pensato di scrivere una piccola guida in modo semplice e didattico affinché sia possibile anche per il neofita utilizzare PHPmailer.
- Procurarsi PHPmailer
PHPmailer è un progetto gratuito e open source. Può essere scaricato dal sito ufficiale:
http://phpmailer.codeworxtech.com/
- Operazioni preliminari
Per prima cosa dovremo includere la classe nel nostro script
Codice PHP:
include_once('percorso.../PHPMailer/class.phpmailer.php');
- Istanziare la classe
Chi non conosce la terminologia della programmazione ad oggetti non si spaventi per il parolone. Istanziare una classe significa semplicemente:
Codice PHP:
$mail = new PHPMailer();
A questo punto $mail è l’istanza che ci permetterà di manipolare i numerosi metodi e proprietà della nostra classe (non spaventatevi, vedrete che è molto semplice).
- L’ uso basilare
Creeremo ora uno script che ci permetterà di inviare un semplice mail testuale. Ci serviranno le proprietà:
From: L’indirizzo email del mittente
FromName: Il nome del mittente
Subject: Il soggetto dell’email
$Body: Il corpo del messaggio
Ed i metodi:
AddAddress: Aggiunge un indirizzo di posta elettronica. Siccome la proprietà AddAddress è un array, possiamo usarla quante volte vogliamo così da aggiungere tutti i destinatari che ci servono.
Send: E’ ovviamente il metodo che ci permette finalmente di inviare il messaggio. Restituisce un valore boleano che ci permetterà tramite la struttura if else di dare un’informazione circa l’invio del nostro email. Va detto che il fatto che venga restituito TRUE, non ci da nessuna garanzia che il destinatario riceva realmente l’email. Send restituisce TRUE se è stato processato e non ha generato nessun errore, il che non vuol dire ancora che sia stato inviato l’email.
Codice PHP:
include_once('percorso.../PHPMailer/class.phpmailer.php');
$mail = new PHPMailer();
$mail->From = "email@tuosito.com";
$mail->FromName = "Nome Cognome";
$mail->Subject = "Il mio primo email con PHPmailer";
$mail->Body = "Testo del messaggio";
$mail->AddAddress("nome1@sito.com");
$mail->AddAddress("nome2@sito.com");
if($mail->Send())
{
echo 'mail inviato correttamente';
}
else
{
echo 'Errore: mail non inviato';
}
AddAddress Può essere evidentemente anche utilizzato in un ciclo, tipicamente quando estraiamo una lista di email da un database
Codice PHP:
while ($row = mysql_fetch_array($res))
{
$mail->AddAddress("$row[mail]");
}
I metodi AddCC e AddBCC funzionano nello stesso modo e servono rispettivamente a definire la copia per conoscenza e la copia per conoscenza nascosta.
Passiamo ora a cose più succose:
- Il metodo MsgHTML:
Se vogliamo inviare un email in formato html non abbiamo che da usare questo metodo in modo semplicissimo:
Codice PHP:
include_once('percorso.../PHPMailer/class.phpmailer.php');
$mail = new PHPMailer();
$mail->From = "email@tuosito.com";
$mail->FromName = "Nome Cognome";
$mail->Subject = "Il mio primo email con PHPmailer";
$html_body = '<html>
<body>
Sono un messaggio [b]html[/b]
</body>
</html>
';
$mail->MsgHTML($html_body);
$mail->AddAddress("nome1@sito.com");
$mail->AddAddress("nome2@sito.com");
if($mail->Send())
{
echo 'mail inviato correttamente';
}
else
{
echo 'Errore: mail non inviato';
}
Sarebbe buona cosa quando si invia un mail html, utilizzare il metodo AltBody con il quale si definisce il testo alternativo se il client di posta elettronica non è abilitato a ricevere messaggi html.
Codice PHP:
$mail->AltBody ("Per poter leggere correttamente questo messaggio è indispensabile che il tuo client di posta elettronica sia abilitato per l'html");
Certo si potrebbe inserire lo stesso messaggio inviato in html ma in formato testuale.
- Il metodo AddAttachment.
Dimenticate le notti insonni provando ad inviare un allegato con la funzione mail. Con il metodo AddAttachement dobbiamo solo dire che file vogliamo allegare:
Codice PHP:
$email->AddAttachment('./percorso/nomefile');
- Il metodo getFile.
E’ possibile prelevare direttamente un file da inviare come body del messaggio utilizzando questo metodo.
Codice PHP:
$body = $mail->getFile('file.html');
$mail->MsgHTML($body);
In questo caso il contenuto html dell’email viene letto direttamente dal file.
- La proprietà ErrorInfo.
In ErrorInfo è contenuto il messaggio di errore (se c’è stato un errore) prodotto dal metodo Send. Potremo cosi modificare la parte finale del nostro script non limitandoci ad eseguire il controllo, ma in caso di errore daremo anche delle informazioni in merito all’errore stesso.
Codice PHP:
if($mail->Send())
{
echo 'mail inviato correttamente';
}
else
{
echo 'mail non inviato a causa del seguente errore: ' . $mail->ErrorInfo;
}
- Definizione del sistema di invio.
Se non altrimenti specificato, PHPmailer eseguirà l’invio tramite la funzione mail di php (notate che a sua volta la funzione mail si appoggia a SMTP sui sistemi windows o a sendmail sui sistemi linux; si veda in proposito il file di configurazione di php).
Con la proprietà Mailer potremo decidere di utilizzare ad esempio il sistema SMTP bypassando di fatto la funzione mail ed utilizzando un qualsiasi server SMTP al quale siamo autorizzati ad accedere.
Codice PHP:
$mail->Mailer = "smtp";
$mail->Host = "smtp.server.com";
# se il server smtp richiede autorizzazione:
$mail->SMTPAuth = TRUE;
$mail->Username = "username";
$mail->Password = "password";
Dopo avere passato in rassegna i metodi e le proprietà principali di PHPmailer vorrei concludere con due note.
- Spam:
Spesso nel nostro forum arrivano richieste del tipo: il mio script invia messaggi correttamente a tutti, ma ai domini xxxx.com e yyyyy.it non arriva nulla. Per esperienza posso dire che in molti casi sono i software anti spam che ovviamente interpretano i nostri messaggi come non desiderati. Dico “ovviamente” perché i così detti spammer utilizzano le nostre stesse tecnologie o comunque delle tecnologie molto simili. Se poi il vostro script è una newsletter, le cose si complicano. Infatti i software antispam non amano molto ricevere email con molti destinatari. Soluzioni assolute non ce ne sono, si possono fare alcuni accorgimenti uno dei quali, a quanto pare è di mettere il return-path nell’header. Con PHPmailer basterà usare la proprietà Sender:
Codice PHP:
$mail->Sender = "tuomail@tuosito.com";
In generale dobbiamo comunque rassegnarci; i nostri messaggi, in alcuni casi, verranno marcati come spam.
Un’ultima nota: Sfruttando le proprietà del paradigma di programmazione ad oggetti, possiamo ulteriormente semplificare il nostro lavoro.
Codice PHP:
class PHPMailerPersonale extends PHPMailer
{
var $Form = "email@tuosito.com";
var $FromName = "Nome Cognome";
var $Subject = "News dal sito";
var $AltBody = "testo alternativo";
function SendConControllo ()
{
if(PHPMailer::Send())
{
echo 'mail inviato correttamente';
}
else
{
echo 'mail non inviato a causa del seguente errore: ' . PHPMailer::ErrorInfo;
}
}
}
In questo caso definisco delle proprietà che sono sempre valide per me, così non le devo definire ogni volta. Inoltre creo un metodo con il quale posso inviare il messaggio ed eseguire il controllo in modo semplificato.
A questo punto istanziamo la classe child ed inviamo il messaggio ma con un codice molto più leggero
Codice PHP:
$mail = new PHPMailerPersonale();
$mail->Body = "Testo del messaggio";
$mail->AddAddress("xxx@yyy.com");
$mail->SendConControllo();