[PHP] Inviare una mail con allegato un file
Giovanni
| Argomenti: php, mail, allegati, file, immagini | 8661
Con questa funzione é possibile inviare una mail allegando un file.
La funzione calcola automaticamente la dimensione e il tipo file e permette anche di utilizzare un foglio di stile e l’html all’interno del testo del messaggio.
Ricordo che per inviare semplicemente una email senza utilizzare html ne’ allegati é sufficiente utilizzare la funzione mail del php.
// // FUNZIONE PER L'INVIO DI MAIL CON ALLEGATI // $mex E' IL MESSAGGIO DELL'EMAIL (CON FORMATTAZIONE HTML) // $oggetto E' L'OGGETTO // $aChi E' IL DESTINATARIO // $mittente E' IL MITTENTE // $allegato E' NOME DEL FILE CHE SI VUOLE ALLEGARE (COMPRENSIVO DI PATH) // $nomeAllegato E' IL NOME DEL FILE ALL'INTERNO DELLA MAIL // $bcc SONO I DESTINATARI DELLE COPIE CONFORMI NASCOSTE // $reply E' LA MAIL A CUI VIENE INVIATA UNA EVENTUALE RISPOSTA // LASCIARE VUOTA SE E' LA STESSA DEL MITTENTE // $stile UN'EVENTUALE BLOCCO DI STILE PER LA FORMATTAZIONE DEL MESSAGGIO // COMPRENSIVO DI <style> E </style> // function mailAllegati( $mex, $oggetto, $aChi, $mittente, $allegato, $nomeAllegato, $bcc = "", $reply = "", $stile = "") { $filetype = mime_content_type($allegato); $filez = fopen($allegato, "r"); $contents = fread($filez, filesize($allegato)); $encoded_attach = chunk_split(base64_encode($contents)); fclose($filez); if ($reply == "") $reply = $mittente; // CREO L'INTESTAZIONE $testa = "From: $mittenten"; if ($bcc != "") $testa .= "BCC: $bcc;n"; $testa .= "Reply-To: $replyn"; $testa .= "X-Mailer: Sismail Web Email Interfacen"; $testa .= "MIME-version: 1.0n"; $testa .= "Content-type: multipart/mixed;n"; $testa .= " boundary="Message-Boundary"n"; $testa .= "Content-transfer-encoding: 7BITn"; $testa .= "X-attachments: $nomeAllegato"; // CREO IL MESSAGGIO $corpo = "--Message-Boundaryn"; $corpo .= "Content-type: text/html; charset=iso-8859-1n"; $corpo .= "Content-transfer-encoding: 7BITn"; $corpo .= "Content-description: Mail message bodynn"; $corpo .= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">"; $corpo .= "<HTML><HEAD>"; $corpo .= "<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">"; $corpo .= $stile; $corpo .= "</HEAD>"; $corpo .= "<BODY>"; $corpo .= $mex; $corpo .= "</BODY></HTML>"; $corpo .= "nn--Message-Boundaryn"; $corpo .= "Content-type: $filetype; name="$nomeAllegato"n"; $corpo .= "Content-Transfer-Encoding: BASE64n"; $corpo .= "Content-disposition: attachment; filename="$nomeAllegato"nn"; $corpo .= "$encoded_attachn"; $corpo .= "--Message-Boundary--n"; if(@mail($aChi, $oggetto, $corpo, $testa)) return true; else return false; }
I parametri da passare sono descritti nel commento in testa alla funzione, ecco comunque un esempio di chiamata:
$aChi = "a_chi_la_mando@tuosito.it"; $mittente = "io@miosito.it"; $oggetto = "Oggetto del messaggio"; $messaggio = "<H1>TITOLO</H1>nCiao!<br />n"; $allegato = "allegato.pdf"; $nomeAllegato = "allegato.pdf"; if (mailAllegati($messaggio, $oggetto, $aChi, $mittente, $allegato, $nomeAllegato, "", "", "")) echo "Invio della email effettuato."; else echo "Invio della email fallito.";
Nel caso non fosse disponibile la funzione mime_content_type, é possibile ovviare mettendo all’inizio del programma:
if ( ! function_exists ( 'mime_content_type ' ) ) { function mime_content_type ( $f ) { return system ( trim( 'file -bi ' . escapeshellarg ( $f ) ) ) ; } }
Come descritto sul manuale del php.
Pubblicato in Funzioni e classi PHP e C |
6 Ottobre 2006 alle 16:48
grazie mille!
funziona a meraviglia
5 Febbraio 2007 alle 13:48
Grazie mille funziona alla grande :D !
ciao ciaoooooooo
27 Marzo 2007 alle 15:18
A me invece non va
dice che non riesce ad aprire il file da allegare…
27 Marzo 2007 alle 15:19
Ho messo il path completo, il file è online e ho inserito:
http://miosito.it/miofile.pdf
Sbaglio qualcosa?
27 Marzo 2007 alle 15:45
Devi mettere il nome del file con path relativo al disco e quindi senza http:, quindi qualcosa tipo miadirectory/miofile.pdf
29 Agosto 2007 alle 16:25
Se si tratta di una immamgine da allegare e non un testo, come si fa in php perchè nella e-mail ricevuta possa vedere l’icona dei file allegati?
30 Agosto 2007 alle 06:20
Se si allega un’immagine (con lo stesso procedimento) si vedrà l’icona degli allegati.
5 Marzo 2008 alle 10:48
E se io volessi impostare un limite massimo per gli allegati?
In modo tale che utenti sprovveduti non mi inviino allegati da 100MB?
5 Marzo 2008 alle 20:48
E’ sufficiente inserire un test prima di chiamare la funzione (o all’inizio della funzione, del tipo:
9 Marzo 2008 alle 21:29
ok grazie
3 Maggio 2008 alle 19:46
php 5+ non va
$Catalog = \
3 Maggio 2008 alle 19:47
ho provato ad inserire codice ma me lo ha tagliato
5 Maggio 2008 alle 05:38
Prova a ripostare senza doppi apici!
8 Agosto 2008 alle 12:05
“\n\n”
non và bene… sarebbe da mettere \r\n perchè certi webmail non fanno vedere l’html se manca la \r…
Per il resto, con qualche modifica, lo script sta eseguendo un ottimo lavoro.
Grazie 1000!!
13 Ottobre 2008 alle 15:11
Mille grazie ho preso spunto dal tuo script per adattarlo alla mia esigenza. mi hai risparmiato un bel po\’ di lavoro.
GRAZIE GRAZIE GRAZIE!!!