Bene, dopo aver visto come inviare email da un form html con php, proviamo a fare qualcosa un pochettino più complicato, aggiungiamo un allegato al nostro form, diamo cosi la possibilità a un utente di inviare un file in aggiunta alla mai.
Iniziamo con il form, per comodità e semplicità realizzeremo un form molto semplice, creiamo la pagina inviamail.php e inseriamo questo codice:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
</head>
<body>
<form action="mailattachment.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="mastermail" value="info@antoniofullone.it">
<table border="0"><tr>
<td>Tua Mail:</td>
<td><input type=”text” name=”mittente” value=”" /></td>
</tr>
<tr>
<td>Oggetto:</td>
<td><input type=”text” name=”oggetto” value=”" /></td>
</tr>
<tr>
<td>Messaggio:</td>
<td><textarea cols=”30″ rows=”6″ name=”testomessaggio”></textarea></td>
</tr>
<tr>
<td>Allega file:</td>
<td><input type=”file” name=”attachment” /></td>
</tr>
<tr>
<td colspan=”2″><input type=”submit” value=”Invia mail” /></td>
</tr>
</table>
</form>
</body>
</html>
Il form è abbastanza semplice, aggiungiamo enctype="multipart/form-data" per poter gestire successivamente il file, se omettiamo questa informazione il form non funzionerà.
Ora passiamo a creare la pagina mailattachment.php e a scrivere il codice per gestire il tutto. Per prima cosa dobbiamo recuperare le variabili passate dal form, come fatto con il precedente tutorial quindi:
<?php
// Recuperiamo i valori dal form e aggiungiamo la nostra email dove ricevere il file allegato con la mail
$to = "la mail dove ricevere il messaggio";
$mail = $_POST['mail'];
$oggetto = $_POST['oggetto'];
$testomessaggio = $_POST['testomessaggio'];
// Creiamo le variabili per il file attachment
$attachment = $_FILES['attachment']['tmp_name'];
$attachment_type = $_FILES['attachment']['type'];
$attachment_name = $_FILES['attachment']['name'];
$headers = "From: " . $to;
// Verifichiamo se è stato eseguito l'upload del fileif (is_uploaded_file($attachment))
{
// usiamo la funzione fopen e fread per aprire e leggere il file e poi chiudiamo con fclose
$file = fopen($attachment,’rb’);
$data = fread($file, filesize($attachment));
fclose($file);
// Codifichiamo il file adattandolo a base64 usando la funzione chunk_split di php
$data = chunk_split(base64_encode($data));
/* Creiamo una variabile per un divisore che deve divir
dere la parte testuale del messaggio dal file stesso altrimenti riceverete una serie illeggibili di caratteri
*/
$func_rand = md5(time());
$mime_divisor = “==Multipart_divisor_x{$func_rand}x”;
// Aggiungo le intestazioni necessarie per l’attachment
$headers .= “\nMIME-Version: 1.0\n”;
$headers .= “Content-Type: multipart/mixed;\n”;
$headers .= ” divisor=\”{$mime_divisor}\”";
// Definisco il tipo di messaggio (MIME/multi-part)
$body .= “This is a multi-part message in MIME format.\n\n”;
// Mettiamo il separatore
$body .= “–{$mime_divisor}\n”;
// Questa è la parte “testuale” del messaggio
$body .= “Content-Type: text/plain; charset=\”iso-8859-1\”\n”;
$body .= “Content-Transfer-Encoding: 7bit\n\n”;
$body .= “From :” . $mail . “\n\n”;
$body .= $messaggio . “\n\n”;
// Ancora il separatore alla fine del contenuto testuale della mail
$body .= “–{$mime_divisor}\n”;
// Adesso aggiungiamo l’allegato alla mail
$body .= “Content-Disposition: attachment;\n”;
$body .= ” filename=\”{$attachment_name}\”\n”;
$body .= “Content-Transfer-Encoding: base64\n\n”;
$body .= $data . “\n\n”;
// chiudo con il separatore
$body .= “–{$mime_divisor}–\n”;
}
else
{
$body = $testomessaggio;
}
// Invio la mail
if (mail($to, $oggetto, $body, $headers))
{
echo “<em>Mail e allegato inviati correttamenti</em>”;
}else{
echo “<em>Ci sono problemi, verifica il codice php</em>”;
}
?>
Sostanzialmente la differenza è nella gestione del file, naturalmente, che viene eseguita attraverso alcune funzioni particolari di php. IL “separatore” viene creato per dividere la parte testuale dal file, è fondamentale.
Vi spiego cosa ho fatto:
essendo il form in formato multi/part (anche questo fondamentale da non omettere nel form) bisogna “spiegare” al server di posta che si tratta di due porzioni separate, delle quali una è testo e l’altra un file.
Altra update importante, viste le continue richieste sia nei commenti che nel forum, hom inserito una validazione del form, con jquery e una piccola funzione ajax per validare sia i dati del form, sia la mail che sia valida. Spero sia utile.
Popularity: 52% [?]
RSS feed dei commenti a questo articolo.
Al momento l'inserimento di commenti non è consentito.
grazie per la tua disponibilità; ho già preparato le due pagine php che verranno pubblicate non appena si renderà necessario.
con simpatia
elisabetta tabacchi
Di nulla.
Se hai problemi sai come contattarmi.
Ciaoo
Mi dice:
Fatal error: Call to undefined function: base64_en() in /membri/gigi/mailattachment.php on line 38
Il mio sito è gigi.altervista.org
Come faccio???
Ciao Gigi,
sicuro che il codice scritto é corretto?
non fare copia e incolla direttamente da qua, potresti aver problemi, meglio riscriverlo.
in caso controlla le caratteristiche del tuo hosting, potrebbe essere un problema di compatibilita.
Seno prova a inviarmi il codice sorgente, magari usa il forum cosi possiamo discuterne meglio:
http://forum.antoniofullone.it
Ciaoo
Ciao, ho provato il tuo codice ma mi restituisce lo stesso errore di Gigi.
Al che ho provato a commentare la linea base64 e il codice funziona, purtroppo però il file, oltre a venire allegato, viene integrato nella mail. Che soluzioni si possono adottare?
Inoltre, c’è il modo per consentire di caricare solo alcuni tipi di file?
grazie
l’errore è proprio in base64_en… non esiste, bisogna correggere in base64_encode :p
Grazie Dario per la correzione.

Il codice è molto “grezzo” diciamo e scritto al volo dopo una richiesta di un utente, oltretutto di fretta.
Io l’ho provato in locale e mi funzionava.
per quanto l’arrivo della mail, io uso “MAIL” sul mio mac, e tutti i file mi arrivano integrati nelle mail, sul mio client è normale, su client windows non ho fatto prove, magari lo provo e ti faccio sapere.
per quanto riguarda il tipo di file puoi gestirlo usando l’array $_FILES creato , dai un occhiata a questo link :
http://www.sitepoint.com/print/advanced-email-php/
Grazie ancora per la segnalazione.
Ciaoo
per “integrato” nella mail intendevo proprio che il contenuto del file appariva in coda alla mail
per quanto riguarda la tipologia di file, non riesco a trovare l’elemento nel link che mi hai segnalato.
grazie
Si perchè il file è incluso all’interno del body del messaggio.

$body .= ” filename=”{$attachment_name}”n”;
Il tutorial è ispirato da quell’articolo.
invece il codice del tipo di file è:
$attachment_type = $_FILES['attachment']['type'];
all’interno del mio codice, nell’articolo originale in inglese invece è:
$fileatt_type = $_FILES['fileatt']['type'];
per verificare l’estensione del file dovresti creare un array che contiene le estensioni che vuoi “accettare” del tipo:
$estensione = array(‘jpg’, ‘jpeg’, ‘gif’);
e poi verificare che il file uploadato abbia una delle estensioni nell’array usando “case” o al limite un “if”, prova a dare un occhiata a questo articolo:
http://www.devshed.com/c/a/PHP/A-Better-Way-to-Determine-MIME-Types-for-MIME-Email-with-PHP/1/
è un articolo completo su come creare una classe per inviare mail e gestire i tipi di file.
Ciaoo
Ciao,
.
ho letto questo tutorial e ti ringrazio per averlo pubblicato, mi hai risolto parecchi problemi.
Non sono del settore però smanetto parecchio con i pc e tutti i moduli contatti che hai pubblicato mi funzionano
Anche io ho avuto problemi con le virgolette (“) e non mi funzionava niente ma poi ho sistemato tutto.
Ora però mi manca di allegare un file e proprio non ci riesco, o meglio, me lo invia ma alla ricezione non lo riesco a scaricare.
Potresti pubblicare il codice precedente con la funzione che lo spedisce in allegato
“$fileatt_type = $_FILES['fileatt']['type'];”
(e non nel corpo del testo).
Spero di essere utile anche agli altri con il mio intervento.
Un saluto.
Ciao digit,
a quale codice ti riferisci? a questo?
sn senza pc, nel senso che il mio mac e in assistenza appena posso pubblico un file zip con il codice completo, che ho gia pronto sul mio mac…
ad ongi modo questo codice e funzionante e testato… l’unico problema le virgolette, e la formattazione del codice…
vedo se posso pubblicarlo entro domani.
Ciaoo
Ciao,
grazie per la risposta veloce.
Si, il codice che ho usato è questo ma come ti dicevo, non essendo esperto, ho provato a modificare il tuo codice per far arrivare l’allegato separato dal corpo della mail (body..) ma non ci sono riuscito.
Vorrei che integrassi questa funzione nel codice che hai pubblicato in questo tutorial, perchè così com’è mi arriva tutto (testo e allegato) come allegato, tutto appiccicato in un unico file (che non soperchè non mi fa ne vedere ne scaricare).
Solo il titolo mi compare esattamete nell’oggetto della mail.
Dici che può essere la mia mail su Google che da problemi?
Grazie per il tuo immenso aiuto.
A prestissimo.
ciao ho scaricato e provato il codice per invio mail e allegato funziona tutto alla perfezione tranne per un piccolo ma rilevante particolare, la mail viene ricevuta come spam e quindi bloccata e senza allegato. puoi aiutarmi in questo problema? ciao e grazie della tua disponibilità…a presto
Ciao halmet il problema dipende dal tuo client, devi impòstarlo in maniera differente, perché con tutti gli altri funziona. Sto cercando di migliorare il codice, o meglio , isnerire l’allegato negli header cosi non avrai problemi, ma per ora funziona cosi.
grazie per la tempestiva risposta e per la tua disponibilà
proverò nel client e ti farò sapere ciao
Ciao Antonio,
io sto sbattendo la testa da 2 giorni con questo codice….
Ti spiego…
ho scaricato il codice e dopo aver aggiustato apici e apicetti vari, provo ad inviare la famosa email.
Senza allegato tutto ok ma appena allego un file mi accade una cosa strana: ricevo l’email e in anteprima vedo anche l’allegato (uso thunderbird). Appena clikko per aprire la mail, scompare la spilletta dell’allegato e non vedo alcun testo nel corpo della mail.
Se leggo la posta attraverso web, l’allegato compare col nome “noname” (uso gmail) e nel corpo della mail nulla.
Cosa sbaglio?
Grazie in anticipo.
Ciao Antonio, ho appena fatto una prova con gmail, la foto mi arriva sia su gmail che sul client di posta configurato, anzi su gmail mi arriva coem allegato.
nel codice che ho messo in download non c’è bisogno di modificare nulla se non il tuo indirizzo email.
per quanto riguarda thunderbird, controlla le impostazioni di antispam, per gmail online anche a me fa cosi, e normale.
Questo codice e molto semplice, la soluzione migliore sarebbe includerlo negli header, ho in programma un articolo su questo a breve.
Ma su thunderbird credo sia un problema che vede la mail come spam o qualcosa del genere.
prova con outlook o un altro client per vedere se fa la stessa cosa.
Ciaoo
Prego solo iddio che nessuno metta questo codice così com’è sui loro siti!
No, non sono pazzo ma fare uno script così è da assassini
Lo script in se funziona come molte persone hanno riportatto, ma lasciare ste variabili così è non solo pericoloso per se, ma anche per gli altri.
$mail = $_POST['mail'];
$oggetto = $_POST['oggetto'];
$testomessaggio = $_POST['testomessaggio'];
Senza controllo la potenza del PHP è nulla (e vai l’ho detta), capisco che non è nello scopo del post scrivere di sicurezza, o forse sì dato che parliamo di email.
Per prima cosa bisognerebbe controllare che ciò che l’utente ha inserito in $mail sia un indirizzo email giusto, poi che ve ne sia uno solo!
Uno dei giochetti dei vari script che lanciano spam è quello di trovare form di invio come questo e poi inserire seguiti da virgole una serie di indirizzi molto lunga.
Quindi prima cosa bisogna verificare che l’email inserita sia valida e poi controllare che dopo la prima email non vi sia una virgola, se c’è cancellare tutto quel che segue.
Stesso ragionamento per oggetto e messaggio ovviamente.
Sul file da aggiungere non dico altro, è fin troppo ovvio che è una cosa pericolosa da fare, ma meno di quanto si pensi.
In ogni caso aggiungere sempre un CAPTCHA magari verbale e non a immagini che è meno sicuro.
Scusate la saccenteria, ma gestisco un server di hosting e grazie a questi script inseriti dai miei clienti passo le notti in bianco
M.
@Marco, se segui la linea degli articoli su php e , in generale, anche del mio sito, si riferisce a chi e ai primi passi con php. ecco il perche del codice semplice.
poi una volta acquisita dimestichezza ognuno selo cambia come vuole.
Io in genere i controlli sul form li faccio lato client con javascript o jquery, non uso php ,evito di ricaricare la pagina e facilito il lavoro al server.
il file allegato l’ ho inserito di proposito nel corpo del messaggio, se mi fossi messo a parlare di header, sicurezza etc,etc. alloral’articolo non avrebbe avuto senso per chi si avvicina al linguaggio e ha voglia di provare a capire come si invia una mail con php, ci sono in giro migliaia di tutorial dedicati, ma tutti a chi e a un certo “livello” di php, qua si parla di primi passi, come la mia semplice guida.
Nessuna saccenteria, figurati.
hasta luego!
Antonio io l’ho scritto più che altro perché ho letto sopra post di persone che l’hanno installato sui loro server così com’è.
Il problema sicurezza è talmente importante che fa passare in secondo piano anche la compilazione di un allegato e di una email.
Il fatto che “esperti” di PHP sanno che la sicurezza dei propri script è importante passa in secondo piano, sono i più quelli che non sono esperti o peggio, credono fermamente di esserlo e sono quelli che fanno più danni in assoluto.
I danni poi non sono riversi contro di loro, il che è peggio, ma contro i gestori dei server, dato che a loro al massimo arriva un po’ di spam che poi filtrano, ma non si curano del fatto che oltre alla loro casella email hanno contribuito a sporcarne migliaglia di altre.
Io credo infine che parlando di email e quindi di form sia importante parlare di sicurezza implicitamente.
Per esempio anche il discorso che fai tu del jquery o comunque del javascript in generale è un discorso che traballa, mi basta spegnere il motore di javascript per fare un cross site scripting o no?
A meno che impedisci di spedire l’email dal form senza il supporto del javascript, ma qui poi blocchiamo l’accessibilità del form, non penso che sia una buona cosa a fronte poi di un minimo davvero, peso di lavoro per una macchina, il server, solitamente potente da poter reggere i pochi giri di clock in più.
Poi oh! Ognuno la pensa come vuole.
Ad majora
Marco come gia detto lo script serve per capire il meccanismo di come si invia una mail con php.
Con jquery o javascript non vedo dove sia il problema con la nostra azienda lo abbiamo usato decine di volte e mai avuto problem, gli spammer usano tanti metodi per “prendere” le mail non solo i form.
Javascript permette di validare form senza dover attendere il caricare della pagina e senza dove eseguire il refresh della pagina.
Che poi al limite si potrebbe eseguire doppia verifica anche con php, non vedo dove sia il problema, con l’impresa dove lavoro io ne abbiamo realizzati con php, con .net e con javascrip mai un problema, sicurezza non vale solo per un semplice form di invio mail, ma sono anche altri gli aspetti che riguardano un sito internet e la sua sicurezza,e questo ricorda che e un semplice tutorial.
Stai facendo discorsi troppo da “guru” per un semplice script per chi vuole imparare a inviare una mail con php, non mi sembra sia il caso di montare tutto questo ambaradan.
Con questo piccolo e “umile” tutorial ho aiutato molte persone a capire come funziona la mail di php, non ho ucciso nessuno, non credi?
No aspetta, non volevo fare il guru, assolutamente e non metto in dubbio che jqueri funzioni, dico solo che con un minimo di attenzione si può fare molto.
Tutto qui
possibile poter inviare più allegati contemporaneamente
A me non arrivano gli allegati
Please help me!
Ciao a tutti, vi avviso che lo script é stato modificato, ho aggiunto un javascript, con jquery, che valida i campi, compresa la mail che sia nel formato corretto, prima dell’invio al server.
Spero vi sia di utilitá.
Ciao
ciao
funziona tutto bene tranne gli allegati in quanto mi dice:
This is a multi-part message in MIME format
e poi mi mette un aserie di numeri e lettere
comunque quando invio senza allegati non mi inserisce il form e mail
ciao…………………
Ciao.
ho modifiacato il form rendendo obbligatori altri campi (cellulare, indirizzo ecc)
quando arriva la mail il testo riporta solo il messaggio.
io vorrei che nel corpo della mail venissero anche gli altri campi. come posso fare?
grazie
@paolo, devi modificare pure le variabili contenute nel file mailattachment cosi e inserirle nel body del messaggio.
leggi questo thread:
http://forum.antoniofullone.it/form-mail-con-allegato-e-campi-obbligatori-t-96.html
Ciao,
è un po’ di tempo che cercavo uno script simile, da utilizzare sul mio sito per farmi inviare le informazioni per lo scambio banner (tra cui l’immagine in allegato).
Purtroppo dopo aver provato più script simili ho visto che tutti davano problema con l’allegato… l’allegato arriva ma mai sotto forma di immagine!
Nel caso di questo script arriva sotto forma di allegato di nome “NONAME” leggibile con il block notes…
Pensavo che il problema fosse strettamente legato a gmail in quanto ho provato con la posta di libero e sembrava funzionare…
Ho visto che qualcun’altro (Antonio) ti ha segnalato lo stesso problema… e la risposta è stata
“Ciao Antonio, ho appena fatto una prova con gmail, la foto mi arriva sia su gmail che sul client di posta configurato, anzi su gmail mi arriva coem allegato.”
Quindi la domanda è come hai fatto?
(tieni conto che ho avutola possibilità di controllare su più indirizi di gmail ed è sempre la stessa storia…)
GUarda lo script come configurato arriva, l’unico problema è che alcuni client di posta lo bloccano come spam, e altri non lo accettano, questo perchè il file arriva incorporato nella mail e non negli header, come dovrebbe essere, devi lavorarci un pochino su e migliorare lo script per far si che arrvi negli header delal mail, cosi dovrebbe funzionare al 100% su tutti i client di posta, tieni presente che questo mio è uno script di esempio per far capire il funzionamento e , di conseguenza, adattarlo alle proprie esigenze.
Cmq a me con gmail arrivava tranquillamente come allegato.