PHP – Spedire E-mail HTML con autenticazione SMTP e Conferma di Lettura a prova di SPAM

Scritto da il 3 mar, 2010 in Programmazione | 0 commenti

In rete ci sono molte guide per spedire e-mail in HTML e non tramite PHP e la sua funzione mail().
Sfortunatamente bisogna prestare molta attenzione a come si compongono, è facile infatti incorrere a molti problemi di compatibilità, specialmente con Client di posta come Outlook e WebMail come Libero.it.
Il problema sta nel fatto che molti programmi o interfacce Web sono molto esigenti in fatto di Content-Type… e se non volete impazzire con Immagini incluse o esterne, allegati e multipart/related o alternative, vi consigliamo di leggere quanto segue.

  • Scaricate le librerie PHPMailer per la versione di PHP 5 o 6 sul sito ufficiale: http://phpmailer.worxware.com
  • Decomprimete il file ZIP e caricate la cartella phpmailer sul vostro server
  • Tutto quello che dovete fare è inserire il seguente codice, ogni volta che dovete inviare un’e-mail:
    require_once(‘phpmailer/class.phpmailer.php’);//caricarlo una sola volta nello script (poi potete inviare infinite email)
    //Dichiaro la classe PHPMailer
    $mail = new PHPMailer(true);
    $mail->IsSMTP(true);//Uso l’autenticazione SMTP
    $mail->IsHTML(true);//Dichiaro che è un’e-mail HTML
    $mail->CharSet = ‘UTF-8′;//Set di Caratteri
    $mail->Host = “smtp.miosito.com”;//Server SMTP
    $mail->SMTPDebug = 0;//Informazioni per il DEBUG (1=solo errori, 2=tutti i messaggi, 0=niente)
    $mail->SMTPAuth = true;//Abilito l’autenticazione SMTP
    $mail->Port = 25;//Porta SMTP (25)
    $mail->Username = “postmaster@miosito.com”;//Account SMTP (deve essere una casella attiva e funzionante sul server, altrimenti potrà essere considerata SPAM)
    $mail->Password = “miapassword”;//Password SMTP
    $mail->AddReplyTo($email_reply, $nome_reply);//risposta a…
    $mail->Priority = 3;//priorità
    $mail->AddAddress($email_dest);//destinatario
    $mail->SetFrom($email_mitt, $nome_mitt);//mittente
  • Ecco alcune varianti:$mail->AddCC($dest_conoscenza);//aggiungo un destinatario come Copia Conoscenza
    $mail->AddBCC($dest_nascosto);//aggiungo un destinatario come Copia Conoscenza Nascosta
    $mail->ConfirmReadingTo = $notificationemail;//indirizzo per la conferma di lettura (se richiesta, altrimenti non dichiararla
    NOTA: potete benissimo intuire che, se si dovesse spedire un gran numero di e-mail (sistema di Newsletter), la funzione AddBCC risulta molto comoda se inserita all’interno di un ciclo for.
  • Passiamo adesso alla compilazione del corpo dell’e-mail:
    per quanto mi riguarda io preferisco avere un template HTML dove inserisco il testo fisso e delle variabili fittizze (p.e. var_nome) che poi andrò a sostituire con i valori corretti o le immagini dell’e-mail.
    Supponiamo di aver creato un template del genere con una Tabella al suo interno, che ospiterà le immagini e il testo.Nello script PHP avrò quindi:$template_file = “template.html”;
    $file = fopen($template_file, ‘r’);
    if ($file !== NULL) {
    $contents = fread($file, filesize($template_file));
    $contents = eregi_replace(“var_mail_messaggio”, $messaggio, $contents);
    $contents = eregi_replace(“var_mail_allegati”, $allegati, $contents);
    $contents = eregi_replace(“var_mail_data”, date(“d/m/Y”,time()), $contents);
    $contents = eregi_replace(“var_mail_ora”, date(“H:i”,time()), $contents);
    $contents = eregi_replace(“var_mail_Htitle”, ‘<img src=”cid:Htitle” width=”650″ height=”40″ alt=”header” />’, $contents);//inserisco l’immagine in alto
    $contents = eregi_replace(“var_mail_bottom”, ‘<img src=”cid:bottom” width=”650″ height=”10″ alt=”bottom” />’, $contents);//inserisco l’immagine in basso
    //Messaggio alternativo nel caso in cui il destinatario non possa vedere il formato HTML
    $Alternative = “$messaggio\n\n”;
    }
    fclose($file);
  • Adesso imposto gli ultimi parametri e invio l’email:$mail->Subject = $oggetto;//oggetto del messaggio
    $mail->AltBody = $Alternative; //includo il messaggio per chi non può visualizzare il formato HTML
    $mail->Body = $contents;//inserisco il contenuto nel Body
    $mail->AddEmbeddedImage(‘header.jpg’, ‘Htitle’, ‘header.jpg’);//aggiungo le immagini inline: filename, cid, name
    $mail->AddEmbeddedImage(‘bottom.jpg’, ‘bottom’, ‘bottom.jpg’);//aggiungo le immagini inline: filename, cid, name
    if($mail->Send()) {
    echo “ok”;
    } else {
    echo “errore”;
    }

NOTE IMPORTANTI:

Ci sono alcune cose da tener presente per quanto riguarda la costruzione dell’e-mail HTML.
Se volete scegliere stili di testo, colori e altro (con i CSS) dovete osservare le seguenti regole per assicurarvi la compatibilità con tutti i client di posta.

  1. Usare CSS inline per il testo e i link (ovvero senza servirsi di documenti .css esterni o caricati sul server): inserire gli stili CSS direttamente nel corpo dell’email (o del template).
  2. Outlook non riconosce gli sfondi nelle tabelle perciò usate solo tinte unite tramite l’attributo bgcolor dei CSS.
  3. Usate solo Tabelle e non elementi DIV. Per me come per altri programmatori/web designer sarà un mezzo insulto, ma purtroppo la nostra cara Microsoft scansa accuratamente i DIV e le E-mail vanno costruite con le Tabelle.
  4. Per gli attributi di stile delle tabelle usatele inline anche queste ovvero direttamente nel TAG TABLE (p.e. <TR style=”……”>”.
  5. Usate le immagini JPEG (scordatevi la trasparenza dei PNG)

Buona fortuna e non dimenticate di provare la ricezione delle e-mail con più Client di posta e WebMail possibili… se state sviluppando una Web Application dovrete investire un po’ di tempo anche in questo!