PHP – Ecco uno script per inserire immagini nel corpo delle mail

febbraio 5th, 2009 - (7 Comments)



Torniamo ad occuparci di PHP, con un script davvero interressante. Attraverso il codice che vedremo, infatti, sarà possibile scrivere delle classi che potranno mandare mail in formato HTML, con all’interno del corpo del messaggio immagini, o immagini e testo.

Quello che vedremo è il cuore del codice che si occupa di configurare la mai e di procedere successivamente all’invio. Il codice è il seguente:

$header = “From: Mittente <mittente@mittente.com>\n”;
$header .= “X-Mailer: il nostro script\n”;

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

$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 il seguente messaggio il tuo programma non supporta i MIME\n\n”;

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

$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”;

$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 <strong>html</strong> ma ha una parte testuale insieme ad una immagine.</p><p>Sito <a href=\”http://www.blogrammazione.it\”>www.blogrammazione.it</a><img src=\”cid:MiaImmagine123\”></p></body></html>\n”;

$messaggio .= “–$boundary2–\n”;

$messaggio .= “–$boundary\n”;
$messaggio .= “Content-ID: <MiaImmagine123>\n”;
$messaggio .= “Content-Type: image/jpeg\n”;
$messaggio .= “Content-Transfer-Encoding: base64\n\n”;

$allegato = “immagine.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@ricevente.it”, $subject, $messaggio, $header) ) echo “e-mail inviata con successo!”;
else echo “errore nell’invio dell’e-mail!”;

Per comodità, il codice sopra scritto è scaricabile come file .txt al seguente indirizzo. Procediamo con l’analisi dello script: dopo aver settato il mittente, creiamo due “boundary”. Queste “etichette” vengono utilizzate nell’intestazione del messaggio per separare le sezioni MIME che compongono il corpo della mail: nel nostro esempio, avremo una sezione di testo visibile solo nel caso in cui il proprio client di posta non supporta il formato MIME, un’altra sezione per il testo della mail e una’altra ancora per l’immagine nel caso in cui il client invece supporti correttamente i formati MIME.

La gestione dell’mmagine avviene nelle seguenti righe di codice:

$messaggio .= “Content-ID: <MiaImmagine123>\n”;
$messaggio .= “Content-Type: image/jpeg\n”;
$messaggio .= “Content-Transfer-Encoding: base64\n\n”;

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

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

Nella prima riga dichiariamo l’id, il nome dell’etichetta che identifica la nostra immagine. La seconda e la tersa riga invece servono per specificare rispettivamente il formato dell’immagine e la codifica. Infatti per inserire l’immagine all’interno del corpo del messaggio, effettueremo una conversione base64, in questo modo evitiamo che venga inserita come semplice allegato e permettiamo al client di posta di visualizzare come parte del corpo della mail.

Le istruzioni successive non fanno altro che permettere la lettura dell’immagine come file ed effettuare la codifica vera e propria. L’ultima istruzione di questo segmento concatena la codifica base64 dell’immagine al corpo del messaggio.

You can follow any responses to this entry through the RSS 2.0 You can leave a response, or trackback.

7 Responses

  • maje says:

    è possibile, ma dovresti fare delle modifiche per la gestione degli allegati! Potresti però vedere il componente Zend Mail dello Zend Framework, trovi la documentazione al seguente indirizzo

    http://framework.zend.com/manual/en/zend.mail.html

    altrimenti è disponibile questo tutorial

    http://www.html-form-guide.com/email-form/php-email-form-attachment.html

    in cui puoi vedere un esempio concreto di utilizzo basilare di invio di email tramite form con file in allegato! :em19:

  • Salento says:

    io sto creando un formmail in php dove vorrei inserire degli allegati per chi mi invia delle richieste dal sito. è possibile usare questo tipo di codice e come se possibile?
    grazie a tutti

  • miseterbarone says:

    Ciao maje
    grazie per la tempestiva risposta .
    non so dove sia il problema non ci riesco se posto una domanda con il codice php relativo al problema non mi fa postare . potrei forse farlo sul tuo sito?

  • maje says:

    Ciao!!

    Mi spiace ma non dovrebbero esserci problemi a postare un commento…magari riprova ad inserire la tua domanda, perchè è davvero strano!

  • miseterbarone says:

    Ciao ho provato piu volte a postare una domanda di aiuto per usare il vostro script , ma mi viene sempre rifiutato o almeno non viene stampatoa video.
    Cé forse un limite di testo , oppure qualche altro tipo di restrizione?
    qualcuno puo aiutarmi ?
    ciao grazie

  • maje says:

    Va inserito nella parte di codice dove prepari l’invio della mail: con questo script andiamo semplicemente a configurare le caratteristiche dei nostri messaggi mail, quindi questo codice va inserito lì dove probabilmente utilizzi la funzione “mail” per l’invio della posta…chiaramente dipende da come hai configurato la gestione delle mail! Se mi fai un esempio specifico, riesco a darti qualche informazione in più! ;)

  • fra says:

    ma dove va inserito qsto codice?



Leave a Reply

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">