E-mail in formato HTML con PHP

20 marzo 2006

Invio di un’e-mail in formato HTML

Tra le intestazioni che si possono specificare ve ne sono alcune fondamentali per raggiungere il nostro obiettivo. Tra queste i MIME, Multiporpouse Internet Mail Extensions. Come si intuisce dal nome, sono estensioni del formato originario con cui venivano inviati i messaggi di posta elettronica, introdotte per poter, ad esempio, inviare allegati o costruire e-mail in formato HTML corredate da immagini, suoni, applet ecc.

  • La prima intestazione da utilizzare è MIME-Version che permette di specificare la versione dello standard MIME.
  • La seconda, Content-Type, specifica il contenuto del messaggio che potrebbe essere testo puro (text/plain), o HTML (text/html), o un’immagine GIF (image/gif) o altro ancora.
  • La terza è Content-Transfer-Encoding ovvero la codifica con cui viene trasmesso il contenuto.

Mettiamo in pratica quanto teorizzato per costruire il nostro primo messaggio in formato HTML:

<?php
// costruiamo alcune intestazioni generali
$header = “From: Inviante <inviante@dominio.org>\n”;
$header .= “CC: Altro Ricevente <altroricevente@dominio.net>\n”;
$header .= “X-Mailer: Il nostro Php\n”;

// costruiamo le intestazioni specifiche per il formato HTML
$header .= “MIME-Version: 1.0\n”;
$header .= “Content-Type: text/html; charset=\”iso-8859-1\”\n”;
$header .= “Content-Transfer-Encoding: 7bit\n\n”;

//costruiamo il testo in formato HTML
$messaggio = “<html><body><p>Questo messaggio è in formato <i>html</i></p><p>Visita il sito <a href=\”http://www.html.it\”>www.html.it</a></p></body></html>”;

$subject = “primo messaggio html”;

// inviamo il messaggio di posta elettronica
// controllando eventuali errori

if( @mail(“ricevente@dominio.it”, $subject, $messaggio, $header) ) echo “e-mail inviata con successo!”;
else echo “errore nell’invio dell’e-mail!”;
?>

Fin qui tutto bene, ma cosa succede se il client di posta del destinatario è stato configurato per non visualizzare il formato HTML, oppure non ne prevede la visualizzazione come accade per alcune webmail? Per evitare tale inconveniente sarà necessario predisporre due versioni del messaggio, una testo puro ed una HTML, lasciando al programma la scelta di visualizzare quella che ritenga più adatta.

Per ottenere questo dovremo utilizzare un Content-Type multipart/alternative per indicare che il messaggio è costituito da più parti (“multipart”) le quali sono tra loro alternative (“alternative”). Per permettere al client di posta di distinguere l’una dall’altra le due parti del messaggio è necessario ricorrere ad un separatore. Tale separatore consiste in una stringa arbitraria chiamata Boundary. Requisito fondamentale è che la stringa sia unica all’interno del messaggio in modo da non confondersi con porzioni del testo. Essa deve inoltre iniziare con due trattini “–“.

La medesima stringa deve essere usata come terminatore dell’e-mail ed in questo caso, oltre ad essere preceduta dai due trattini, deve essere terminata con i due trattini “–“. Potrebbe andare bene qualcosa di simile a MiaStringa123, ma, per evitare errori, conviene generarla in modo pseudocasuale. Ad esempio si può sfruttare la funzione md5(), che calcola l’hash md5 di una stringa, applicandola al timestamp unix così:

$boundary = “==String_Boundary_x” .md5(time()). “x”;

Vediamo il codice che ci permette di ottenere quanto sopra descritto:

<?php
// costruiamo alcune intestazioni generali
$header = “From: Inviante <inviante@dominio.org>\n”;
$header .= “CC: Altro Ricevente <altroricevente@dominio.net>\n”;
$header .= “X-Mailer: Il nostro Php\n”;

// generiamo la stringa che funge da separatore
$boundary = “==String_Boundary_x” .md5(time()). “x”;

// costruiamo le intestazioni che specificano
// un messaggio costituito da più parti alternative

$header .= “MIME-Version: 1.0\n”;
$header .= “Content-Type: multipart/alternative;\n”;
$header .= ” boundary=\”$boundary\”;\n\n”;

// questa parte del messaggio viene visualizzata
// solo se il programma non sa interpretare
// i MIME poiché è posta prima della stringa boundary
$messaggio = “Se visualizzi questo testo il tuo programma non supporta i MIME\n\n”;

// inizia la prima parte del messaggio in testo puro
$messaggio .= “–$boundary\n”;
$messaggio .= “Content-Type: text/plain; charset=\”iso-8859-1\”\n”;
$messaggio .= “Content-Transfer-Encoding: 7bit\n\n”;
$messaggio .= “Messaggio in formato testo.\n\n”;

// inizia la seconda parte del messaggio in formato html
$messaggio .= “–$boundary\n”;
$messaggio .= “Content-Type: text/html; charset=\”iso-8859-1\”\n”;
$messaggio .= “Content-Transfer-Encoding: 7bit\n\n”;
$messaggio .= “<html><body><p>Questo messaggio è in formato <i>html</i> ma ha una parte testo.</p><p>Visita il sito <a href=\”http://www.html.it\”>www.html.it</a></p></body></html>\n”;

// chiusura del messaggio con la stringa boundary
$messaggio .= “–$boundary–\n”;

$subject = “secondo messaggio html”;

if( @mail(“ricevente@dominio.it”, $subject, $messaggio, $header) ) echo “e-mail inviata con successo!”;
else echo “errore nell’invio dell’e-mail!”;
?>

Una piccola notazione: se vogliamo suddividere un header su più righe, le righe addizionali devono iniziare con uno o più spazi per indicare che sono la continuazione delle righe precedenti. Ecco perché il codice sopra riportato è stato scritto così:

$header .= “Content-Type: multipart/alternative;\n”;
$header .= ” boundary=\”$boundary\”;\n\n”;

Se vuoi aggiornamenti su E-mail in formato HTML con PHP inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su E-mail in formato HTML con PHP

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy