Inviamo email in modo professionale con PHP e mettiamole in "posta inviata"
Ormai in tutti i siti internet e applicazioni web è indispensabile disporre di un sistema di invio email automatico, ad esempio per il classico form di contatto, oppure per l'iscrizione degli utenti, ecc.
Per semplicità si usa spesso la funzione mail() di PHP che sfrutta Sendmail; in questo caso è il web server stesso che si occupa di consegnare il messaggio al server di posta del destinatario, detto in modo molto semplice. Questo però comporta il rischio che il messaggio venga bloccato da un sistema antispam. Ultimamente infatti molti sistemi antispam (ad esempio quello di Google) segnano come spam la maggior parte dei messaggi inviati tramite web server o smtp anonimi. Sendmail è effettivamente un sistema di invio anonimo.
È bene quindi utilizzare un altro sistema, come il classico SMTP autenticato. E perché non fare in modo che l'email inviata automaticamente con lo script PHP non venga inserita nella nostra cartella della posta inviata?
Requisiti
Possiamo fare tutto ciò disponendo di una casella di posta accessibile senza restrizioni tramite credenziali (user e password) e che supporti il protocollo IMAP. Ad esempio un account GMail va piú che bene, ma vanno bene anche le caselle offerte da un semplice hosting Aruba, giusto per citarne uno. Basta conoscere l'indirizzo del server SMTP (ad esempio quello di GMail è smtp.gmail.com), la username e la password. Inoltre abbiamo bisogno delle classi PHP specifiche per le email, nel nostro caso PHPMailer.
Dopo aver scaricato il pacchetto e sistemati i file delle classi (ne servono solo 2: class.phpmailer.php e class.smtp.php) insieme al nostro script possiamo iniziare l'implementazione.
Implementazione
Per prima cosa richiamiamo la classe e creiamo l'oggetto PHPMailer.
require_once 'class.phpmailer.php'; class PHPMailer_custom extends PHPMailer { public function get_mail_string() { return $this->MIMEHeader.$this->MIMEBody; } } $mail = new PHPMailer_custom();
Notiamo subito che in realtà abbiamo creato una classe estensione dell'originale, poiché piú tardi avremo bisogno di accedere agli attributi MIMEHeader e MIMEBody che sono privati. Comunque quello che conta adesso sta in $mail che racchiude l'istanza di PHPMailer. Definiamo quindi i parametri fondamentali:
$mail->IsSMTP(); $mail->SMTPAuth = true; $mail->SMTPSecure = 'ssl'; $mail->Host = 'smtp.dominio.com'; $mail->Port = 465; $mail->Username = 'la_mia_username'; $mail->Password = 'la_mia_password'; $mail->IsHTML(true); $mail->From = '[email protected]'; $mail->AddReplyTo('[email protected]'); $mail->FromName = 'Michele';
I parametri appena descritti indicano che sto per utilizzare un server SMTP, il quale richiede autenticazione e utilizza una connessione protetta da un certificato SSL (che come porta standard usa la 465). Ho usato come esempio queste impostazioni perché sono le stesse di GMail. Se ad esempio utilizzassimo un server SMTP senza SSL basterebbe lasciare vuoto SMTPSecure e impostare la porta 25 oppure la 587. Gli altri parametri sono semplici, specificano il mittente e se il contenuto del messaggio è in formato HTML, in questo caso sí.
Proseguiamo:
$mail->CharSet = 'UTF-8'; $mail->Subject = 'Oggetto del messaggio' $mail->Hostname = 'dominio.com'; $mail->Body = '<html><head></head><body>Ciao questo è il contenuto del messaggio in <b>HTML</b></body></html>'; $mail->AltBody = $mail->html2text($mail->Body); $mail->AddAttachment('foto.jpg', 'lamiafoto.jpg');
Mai sottovalutare il charset, assicurarsi che sia corrispondente a quello con cui è stato composto il messaggio, come ad esempio quello della pagina HTML dove l'utente compila il form di contatto. Lo standard è ormai UTF-8. Abbiamo aggiunto anche una foto come allegato, molto semplicemente. Finalmente impostiamo il destinatario e inviamo il messaggio
$mail->AddAddress('[email protected]'); $result = $mail->Send();
A questo punto non ci resta che esaminare il risultato e eventualmente inserire il messaggio nella cartella posta inviata della nostra mailbox
if($result) { $mail_string = $mail->get_mail_string(); $ImapStream = imap_open('{imap.dominio.com:143/notls}Sent', 'la_mia_username', 'la_mia_password'); if($ImapStream) imap_append($ImapStream, '{imap.dominio.com:143/notls}Sent', $mail_string, '\\Seen'); } else { // se qualcosa è andato storto scrivo l'errore echo $mail->ErrorInfo; }
Ecco a cosa serviva estendere la classe PHPMailer con il metodo get_mail_string(). Dopo aver stabilito la connessione con il server IMAP della nostra mailbox utilizziamo la funzione imap_append, che necessita della strina che racchiude l'intero messaggio. Infatti una email non è altro che una stringa debitamente formattata, composta da un header e un body. Potete verificare con il vostro client di posta, ad esempio Thunderbird, selezionando un messaggio e cliccando su visualizza -> sorgente del messaggio. Header e body del messaggio inviato sono contenuti negli attributi privati dell'oggetto PHPMailer, MIMEHeader e MIMEBody.
In questo modo ci ritroveremo il messaggio visibile ad esempio nel client di posta che utilizziamo, come thunderbird, o sul nostro smartphone. Comodo!












