Invio di email via Php con Swift Mailer

La possibilità della semplice funzione mail() di Php ci limita molto, ad esempio quello che riguarda il formato del messaggio, l'invio a indirizzi multipli o di gestire il tipo di protocollo di trasporto. La strada per un Cms che preveda di fare anche questo mi è stata ampiamente facilitata dalla libreria Swift Mailer di Chris Corbyn, che mi ha aiutato nella composizione del sistema di newsletter, per quei progetti che la includono.

Sebbene l'ampia documentazione (in inglese) del sito abbastanza chiara ed esaustiva, mi ripropongo per mostrarne un esempio pratico, estratto semplificato dal sistema che uso io.

Swift Mailer non è un'applicazione ma una libreria! Per alcuni sviluppatori questo potrebbe essere ovvio ma è comunque importante chiarirlo: Swift non ha una interfaccia grafica di configurazione per l'utente, non può essere aperto con il browser direttamente. Se cercate un software pronto che permetta di far ciò potreste provare PHPList. Swift Mailer invece ha una struttura a componenti che consente di implementarlo liberamente in svariate modalità all'interno del vostro progetto in Php.

Cominciamo con l'inclusione della classe, con require_once viene fatta una volta sola, ed il codice si blocca se non riesce a trovare il file.
Dato che la libreria comprende una serie di file e sottocartelle, il file swift_required.php si occupa di includere tutto in una volta

require_once 'lib/swift_required.php';

Il mio metodo prevede che le fasi della composizione e dell'invio siano racchiuse in una funzione sendmail, che accetta come argomenti un array di destinatari, l'oggetto del messaggio, il messaggio (sia in testo semplice che in HTML), il mittente e il suo indirizzo, questi ultimi configurati di default nel caso non vengano passati.

function sendmail($destinatari, $oggetto, $messaggio, $messaggioHtml, $mittente="admin@miodominio.it", $nome_mittente = "Nome del mittente") { }

All'interno della funzione, inizializzo delle frasi comuni, per la composizione del messaggio completo

$site = 'http://www.miodominio.it'; $firma = 'Il mio sito web - '. $site; $firmaHtml = 'Il mio sito web - <a href="'.$site.'" > ' . $site . '</a>'; $cancellazione = 'Per non ricevere più queste e-mail visita la pagina " . $site . "/newsletter.php?rimuovi=1"; $cancellazioneHtml = 'Per non ricevere più queste e-mail clicca qui <a href=" . $site . '/newsletter.php?rimuovi=1" >' . $site . '/newsletter.php?rimuovi=1</a>'; $messaggio_completo = $messaggio . $firma . $cancellazione; $messaggio_completoHtml = $messaggioHtml . $firmaHtml . $cancellazioneHtml;

La funzione di Swift per comporre l'oggetto è newInstance()

$mio_messaggio = Swift_Message::newInstance() ->setSubject($oggetto) ->setFrom(array($mittente => $nome_mittente)) ->setReturnPath($mittente) //->setReadReceiptTo($mittente) //se voglio la conferma di lettura //->setPriority(1) //per aumentare la priorità ->setTo(array($destinatari)) ->setBody($messaggio_completoHtml, 'text/html') //Corpo del messaggio ->addPart($messaggio_completo, 'text/plain') //Alternativa del messaggio in testo semplice ;

Si crea quindi un protocollo per la configurazione della connessione, in questo caso io uso SMTP ma esistono anche altri due protocolli che non approfondisco. Con Smtp la configurazione è semplice, basta indicare il server, la user e la password del vostro account di posta - se stesse configurazione che usereste nei client come Outlook o Thunderbird.
Alcuni server SMTP, per esempio quello di Google, usano la codifica per ragioni di sicurezza. Swift Mailer supporta entrambe le configurazioni SSL e TLS, in quel caso la porta non sarà 465 o 587. Gli oggetti che si creano in questa fase sono due : uno di trasporto ed uno chiamato mailer, che si costruisce con il parametro di trasporto.

$trasporto = Swift_SmtpTransport::newInstance('smtp.miodominio.it', 25) ->setUsername('nome-utente-smtp') ->setPassword('password-smtp'); $mailer = Swift_Mailer::newInstance($trasporto);

Al termine l'invio del messaggio si effettua chiamando il metodo send() dell'oggetto mailer creato in precedenza. Ci resituirà il numero degli indirizzi email a cui è riuscito a mandare il messaggio.

$indirizzi_riusciti = $mailer->send($mio_messaggio); return $indirizzi_riusciti;

Creata la funzione a questo punto costruisco la chiamata, configurandone i cinque parametri con tre destinatari (di fantasia!)

$destinatari = array('pippo@libero.it', 'topolino@yahoo.it', 'paperino@virgilio.it'); $messaggioHTML = "Vi mando un <em>cordiale</em> saluto"; sendmail($destinatari, "Saluti" , strip_tags($messaggioHTML) , $messaggioHTML , "ciccio@ciccio.it", "Ciccio");

Il codice completo con l'intera funzione dunque è:

require_once 'lib/swift_required.php'; function sendmail($destinatari, $oggetto, $messaggio, $messaggioHtml, $mittente="admin@miodominio.it", $nome_mittente = "Nome del mittente"){ // generazione frasi comuni $site = 'http://www.miodominio.it'; $firma = 'Il mio sito web - '. $site; $firmaHtml = 'Il mio sito web - <a href="'.$site.'" > ' . $site . '</a>'; $cancellazione = 'Per non ricevere più queste e-mail visita la pagina " . $site . "/newsletter.php?rimuovi=1"; $cancellazioneHtml = 'Per non ricevere più queste e-mail clicca qui <a href=" . $site . '/newsletter.php?rimuovi=1" >' . $site . '/newsletter.php?rimuovi=1</a>'; //Composizione del testo messaggio $messaggio_completo = $messaggio . $firma . $cancellazione; $messaggio_completoHtml = $messaggioHtml . $firmaHtml . $cancellazioneHtml; $mio_messaggio = Swift_Message::newInstance() ->setSubject($oggetto) ->setFrom(array($mittente => $nome_mittente)) ->setReturnPath($mittente) //->setReadReceiptTo($mittente) //se voglio la conferma di lettura //->setPriority(1) //per aumentare la priorità ->setTo(array($destinatari)) ->setBody($messaggio_completoHtml, 'text/html') //Corpo del messaggio ->addPart($messaggio_completo, 'text/plain') //Alternativa del messaggio in testo semplice ; //Crezione di un protocollo di trasporto $transport = Swift_SmtpTransport::newInstance('smtp.miodominio.it', 25) ->setUsername('la-user-smtp') ->setPassword('la-password-smtp'); $mailer = Swift_Mailer::newInstance($transport); //Invio del messaggio $result = $mailer->send($mio_messaggio); return $result; } $destinatari = array('pippo@libero.it', 'topolino@yahoo.it', 'paperino@virgilio.it'); $messaggioHTML = "Vi mando un <em>cordiale</em> saluto"; sendmail($destinatari, "Saluti" , strip_tags($messaggioHTML) , $messaggioHTML , "ciccio@ciccio.it", "Ciccio");