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

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.

11 commenti su “PHP – Ecco uno script per inserire immagini nel corpo delle mail”

  1. ciao a tutti!

    Ho fatto in una sera il sito di auguri che vedete e ora mi sono posto il problema di rendere possibile per i miei visitatori l’invio delle immagini che ho pubblicato; l’invio vorrei che avvenisse scegliendole dal sito quindi non mi è sufficiente il classico “Sfoglia” che consente all’utente di prendere i file da allegare dal suo computer.
    Io vorrei che le immagini le potesse prendere dal server su cui gira il sito.
    Meglio di tutto sarebbe una specie di drag-and-drop per cui si trascina l’immagine dalle gallery “dentro” la mail di auguri che si sta componendo (preciso che il relativo form di composizione non l’ho ancora inserito ma pensavo a un classico form POST con elaborazione dati tramite php).
    Immagino però che sia piuttosto complicato… qualcuno può aiutarmi?

    Grazie a tutti e…BuoneFeste ! (.in ;)))

  2. @fabio
    certo, è sufficiente aggiungere un secondo boundary per la seconda immagine (praticamente il codice può essere molto simile a quello della prima immagine), tutto qui! 😉

  3. ciao a tutti ho il seguente problema , in pratica nel form htmsubito dopo l’invio vedo l’immagine ma poi quando arriva l aposta arriva cosi:
    Questo messaggio è in formato html ma ha una parte testo.Visita il sito http://www.html.it

    non riesco a visualizzare l’immagine ma solo il link

  4. è 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:

  5. 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

  6. 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?

  7. Ciao!!

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

  8. 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

  9. 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ù! 😉

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*