E-mail in formato HTML con PHP

20 marzo 2006

Prevediamo ancora un’alternativa testuale

Con un ultimo sforzo mettiamo insieme quanto abbiamo sin qui visto per realizzare un messaggio HTML con un’immagine “embedded”, ma che presenti anche l’alternativa in testo puro. Dovremo definire un messaggio multipart/related, ma una delle due parti dovrà essere a sua volta un multipart/alternative per prevedere sia il testo puro che il formato HTML.

Per realizzare tutto questo dovremo ricorrere a due stringhe boundary: una farà da separatore del multipart/related e l’altra del multipart/alternative.

<?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 le stringhe utilizzate come separatori
$boundary = “==String_Boundary_x” .md5(time()). “x”;
$boundary2 = “==String_Boundary2_y” .md5(time()). “y”;

// costruiamo le intestazioni specifiche per un messaggio
// con parti relazionate

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

$messaggio = “Se visualizzi questo testo il tuo programma non supporta i MIME\n\n”;

// il primo segmento del multipart/related
// è definito come multipart/alternative

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

// sezione alternativa in puro testo
$messaggio .= “–$boundary2\n”;
$messaggio .= “Content-Type: text/plain; charset=\”iso-8859-1\”\n”;
$messaggio .= “Content-Transfer-Encoding: 7bit\n\n”;
$messaggio .= “Messaggio alternativo in formato testo.\n\n”;

// sezione alternativa in formato html
$messaggio .= “–$boundary2\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><img src=\”cid:MiaImmagine123\”></p></body></html>\n”;

// chiusura della sezione multipart/alternative
$messaggio .= “–$boundary2–\n”;

// seconda sezione del multipart/related contenente l’immagine
$messaggio .= “–$boundary\n”;
$messaggio .= “Content-ID: <MiaImmagine123>\n”;
$messaggio .= “Content-Type: image/jpeg\n”;
$messaggio .= “Content-Transfer-Encoding: base64\n\n”;

$allegato = “./images/miaimmagine.jpg”;
$file = fopen($allegato,’rb’);
$data = fread($file,filesize($allegato));
fclose($file);

$data = chunk_split(base64_encode($data));
$messaggio .= “$data\n\n”;

// chiusura della sezione multipart/related
$messaggio .= “–$boundary–\n”;

$subject = “oggetto del messaggio alternativo con immagini inline”;

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

Conclusioni

In questo articolo abbiamo esplorato le possibilità fornite dai MIME per generare messaggi in formato HTML, naturalmente non abbiamo esaurito tutte le potenzialità di tali estensioni. Per chi fosse interessato, ad esempio, alla generazione di messaggi con file allegati rimando all’articolo già citato La funzione mail().

Si noti che il codice sopra riportato è volutamente semplificato, data la sua natura esemplificativa, per questo non adatto ad essere utilizzato “in produzione” con un semplice copia incolla. Si riferisce specificamente ad un sistema unix-like con web server Apache. Sono documentate in Rete alcune anomalie di comportamento relative alla funzione PHP mail() su server Windows.

Se decidete di lavorare con le estensioni MIME sappiate che non tutti i client di posta elettronica le interpretano esattamente allo stesso modo, specialmente nei casi più complessi in cui si utilizzino varie sezioni multipart annidate. Questo significa che l’implementazione del codice richiederà pazienza, diversi esperimenti e si dovrà procedere per successivi aggiustamenti. Facendo riferimento a Microsoft Outlook per Windows (il client di posta elettronica probabilmente più diffuso nel nostro paese) ho rilevato in alcune circostanze comportamenti difformi addirittura tra la versione principale e la versione “light” Outlook Express. D’altro canto chi ha un po’ di esperienza sa che, purtroppo, la standardizzazione rimane una chimera.

Gli esempi riportati sono comunque frutto di una ricerca di compatibilità tra i client di posta e le webmail più utilizzate.

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