di: Ermanno Ancona 23 Settembre 2004
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!";
?>
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.
Guida Yii FrameworkCome creare applicazioni Web in modo semplice e veloce con il... |
Guida Zend FrameworkDiventate professionisti dello sviluppo Web. Zend Framework è lo... |
Guida Applicazioni Facebook con PHPCome realizzare un'applicazione per Facebook. Dalle basi della... |
Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.
Iscriviti alla newsletter
|
|
Corso PHP per Webmaster11 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |