problemi con l'invio di allegato in un form

  • Creatore Discussione Creatore Discussione vale-
  • Data di inizio Data di inizio

vale-

Nuovo Utente
24 Feb 2014
5
0
0
Buongiorno,
ho creato un form mail con allegato ed ho problemi con l'allegato, ovvero quando compilo il form senza allegato tutto funziona correttamente mentre quando lo invio con allegato (ricevendo la mail su outlook) il messaggio appare vuoto o con solo le informazioni di testo e una serie di codici al posto dell'allegato mentre se uso il programma mail il messaggio e l'allegato si vedono correttamente.
Non riesco a far visualizzare correttamente l'allegato utilizzando come programma di ricezione outlook.

Questo è il codice php che uso:
PHP:
<?php
// Recuperiamo i valori dal form e aggiungiamo la nostra email dove ricevere il file allegato con la mail
$to = "[email protected]". ", ". "$mail";
$oggetto = "form per l'accesso immediato al prelievo";
$cognome = trim($_POST['cognome']);
$nome = $_POST['nome'];
$datanascita = $_POST['datanascita'];
$luogonascita = $_POST['luogonascita'];
$codicefiscale = $_POST['codicefiscale'];
$indirizzo = $_POST['indirizzo'];
$telefono = $_POST['telefono'];
$cellulare = $_POST['cellulare'];
$tesserasanitaria = $_POST['tesserasanitaria'];
$medicorichiedente = $_POST['medicorichiedente'];
$dataprelievo = $_POST['dataprelievo'];
$area = $_POST['area'];
$testomessaggio = $_POST['testomessaggio'];
$mail = $_POST['mail'];  

// 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 file
if (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_boundary = "==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_boundary}\"";

  // 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_boundary}\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 .= "Cognome: " . $cognome . "\n\n";
  $body .= "Nome: " . $nome . "\n\n";
  $body .= "Data di nascita: " . $datanascita . "\n\n";
  $body .= "Luogo di nascita: " . $luogonascita . "\n\n";
  $body .= "Codice Fiscale: " . $codicefiscale . "\n\n";
  $body .= "Indirizzo: " . $indirizzo . "\n\n";
  $body .= "Telefono: " . $telefono . "\n\n";
  $body .= "Cellulare: " . $cellulare . "\n\n";
  $body .= "Numero Tessera Sanitaria: " . $tesserasanitaria . "\n\n";
  $body .= "Medico richiedente: " . $medicorichiedente . "\n\n";
  $body .= "Data in cui intendo effettuare il prelievo: " . $dataprelievo . "\n\n";
  $body .= "Luogo in cui si intende effettuare il prelievo: " . $area . "\n\n";
  $body .= "Esami da effettuare: " . $testomessaggio . "\n\n";
  $body .= "Indirizzo e-mail al quale inviare i risultati: " . $mail . "\n\n";
  
  //  Ancora il separatore alla fine del contenuto testuale della mail
  $body .= "--{$mime_boundary}\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_boundary}--\n";
}
else
{
  $body .= "Cognome: " . $cognome . "\n\n";
  $body .= "Nome: " . $nome . "\n\n";
  $body .= "Data di nascita: " . $datanascita . "\n\n";
  $body .= "Luogo di nascita: " . $luogonascita . "\n\n";
  $body .= "Codice Fiscale: " . $codicefiscale . "\n\n";
  $body .= "Indirizzo: " . $indirizzo . "\n\n";
  $body .= "Telefono: " . $telefono . "\n\n";
  $body .= "Cellulare: " . $cellulare . "\n\n";
  $body .= "Numero Tessera Sanitaria: " . $tesserasanitaria . "\n\n";
  $body .= "Medico richiedente: " . $medicorichiedente . "\n\n";
  $body .= "Data in cui intendo effettuare il prelievo: " . $dataprelievo . "\n\n";
  $body .= "Luogo in cui si intende effettuare il prelievo: " . $area . "\n\n";
  $body .= "Esami da effettuare: " . $testomessaggio . "\n\n";
  $body .= "Indirizzo e-mail al quale inviare i risultati: " . $mail . "\n\n";
}

// Invio la mail
if($cognome=="")
{echo "non hai inserito il cognome "; }else
if($nome=="")
{echo "non hai inserito il nome "; }else
if($datanascita=="")
{echo "non hai inserito la tua data di nascita "; }else
if($luogonascita=="")
{echo "non hai inserito il luogo di nascita "; }else
if($codicefiscale=="")
{echo "non hai inserito il codice fiscale "; }else
if($indirizzo=="")
{echo "non hai inserito l'indirizzo "; }else
if($tesserasanitaria=="")
{echo "non hai inserito il numero della tessera sanitaria "; }else
if($dataprelievo=="")
{echo "non hai inserito la data in cui intendi effettuare il prelievo "; }else
if($area=="")
{echo "area "; }else
if($testomessaggio=="")
{echo "non hai inserito gli esami da effettuare "; }else
if($mail=="")
{echo "non hai inserito l'indirizzo e-mail al quale inviare i risultati "; }

else
if (mail($to, $oggetto, $body, $headers))
{
  echo "<em>Mail e allegato inviati correttamente </em>";
}{
echo "<em>torna indietro</em>";
}
?>


<br /><br /><br /><br />
<div style="font-family:arial, verdana;text-align:center;width:100%;"><?=$messaggio?></div>
<p align="center"><input name="newmail" type="button" lang="it" onClick="javascript:history.back()" value="Torna Indietro" /></p>
 
Ultima modifica di un moderatore:
Hai scelto la via del suplizzio ... ;) ... cmq buttando un colpo d'occhio al codice manca l'istruzione Content-Length: che determina la dimensione del data delle altre istruzioni più contenuto e i comandi nuova riga ci sono dei \r\n mentre tu hai dato l'istruzione nuova e basta... perche non usi la funzione move_uploaded_file () ???
 
Hai scelto la via del suplizzio ... ;) ... cmq buttando un colpo d'occhio al codice manca l'istruzione Content-Length: che determina la dimensione del data delle altre istruzioni più contenuto e i comandi nuova riga ci sono dei \r\n mentre tu hai dato l'istruzione nuova e basta... perche non usi la funzione move_uploaded_file () ???

Scusami ma non sono molto pratica con i codici php se riesci a dirmi di preciso cosa devo inserire e dove ho sbagliato ti ringrazio infinitamente perchè è tutta mattina che sto buttando via la testa per questa cosa e non riesco a trovare una soluzione. Per quanto riguarda la funzione move_uploaded_file () non so di preciso di cosa si tratta.
Spero in un tuo aiuto
grazie mille
 
questo è un esempio di come fare normalmente un upload di un file.
codice php:
PHP:
<?php

define(“UPLOAD_DIR”, “./uploads/”);

if(isset($_POST['action']) and $_POST['action'] == ‘upload’)
{
    if(isset($_FILES['user_file']))
    {
        $file = $_FILES['user_file'];
        if($file['error'] == UPLOAD_ERR_OK and is_uploaded_file($file['tmp_name']))
        {
            move_uploaded_file($file['tmp_name'], UPLOAD_DIR.$file['name']);
        }
    }
}

?>

codice html che deve puntare al codice php precedente:
HTML:
<form method=”post” action=”upload.php” enctype=”multipart/form-data”>
            <label>Carica il tuo file:</label>
            <input type=”file” name=”user_file” />
            <br />
            <input type=”submit” value=”Carica” />
        </form>

questo che ti ho messo è solo il form che si utlizza per caricare il file. Con questo codice php e la marcatura html che ti ho messo ti bastano per effettuare upload...
 
questo è un esempio di come fare normalmente un upload di un file.
codice php:
PHP:
<?php

define(“UPLOAD_DIR”, “./uploads/”);

if(isset($_POST['action']) and $_POST['action'] == ‘upload’)
{
    if(isset($_FILES['user_file']))
    {
        $file = $_FILES['user_file'];
        if($file['error'] == UPLOAD_ERR_OK and is_uploaded_file($file['tmp_name']))
        {
            move_uploaded_file($file['tmp_name'], UPLOAD_DIR.$file['name']);
        }
    }
}

?>

codice html che deve puntare al codice php precedente:
HTML:
<form method=”post” action=”upload.php” enctype=”multipart/form-data”>
            <label>Carica il tuo file:</label>
            <input type=”file” name=”user_file” />
            <br />
            <input type=”submit” value=”Carica” />
        </form>

questo che ti ho messo è solo il form che si utlizza per caricare il file. Con questo codice php e la marcatura html che ti ho messo ti bastano per effettuare upload...



Ma come faccio ad inserire questo codice nel file php che ho postato in precedenza? ho fatto un paio di prove ma inserendo il codice che mi hai mandato mi dice sempre errore nella linea ... come faccio??...Aiuto!!
 
PHP:
<?php
$temp = substr($_FILES["file"]["name"], -3);
if ((($_FILES["f"]["type"] == "image/gif")
|| ($_FILES["f"]["type"] == "image/jpeg")
|| ($_FILES["f"]["type"] == "image/jpg")
|| ($_FILES["f"]["type"] == "image/pjpeg")
|| ($_FILES["f"]["type"] == "image/x-png")
|| ($_FILES["f"]["type"] == "image/png")
|| ($temp == "gif")
|| ($temp == "jpg")
|| ($temp == "jpeg")
|| ($temp == "png"))
&& ($_FILES["f"]["size"] < 200000))
  {
if ($_FILES["f"]["error"] > 0)
    {
    echo "errore : " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
move_uploaded_file($_FILES["f"]["tmp_name"], "upload/" . $_FILES["f"]["name"]);
}
}else{
echo "tipo di file non valido";
}      
?>

HTML:
<html>
<body>
<form action="" method="post" enctype="multipart/form-data">
<label for="file">nome file:</label>
<input type="file" name="f"><br>
<input type="submit" name="submit" value="carica file">
</form>

</body>
</html>

aggiungi i marcatori input al tuo form, togli la parte che utilizzi per trasmettere il file e inserisci questo codice php.
 
Ultima modifica:
PHP:
<?php
$temp = substr($_FILES["file"]["name"], -3);
if ((($_FILES["f"]["type"] == "image/gif")
|| ($_FILES["f"]["type"] == "image/jpeg")
|| ($_FILES["f"]["type"] == "image/jpg")
|| ($_FILES["f"]["type"] == "image/pjpeg")
|| ($_FILES["f"]["type"] == "image/x-png")
|| ($_FILES["f"]["type"] == "image/png")
|| ($temp == "gif")
|| ($temp == "jpg")
|| ($temp == "jpeg")
|| ($temp == "png"))
&& ($_FILES["f"]["size"] < 200000))
  {
if ($_FILES["f"]["error"] > 0)
    {
    echo "errore : " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
move_uploaded_file($_FILES["f"]["tmp_name"], "upload/" . $_FILES["f"]["name"]);
}
}else{
echo "tipo di file non valido";
}      
?>

HTML:
<html>
<body>
<form action="" method="post" enctype="multipart/form-data">
<label for="file">nome file:</label>
<input type="file" name="f"><br>
<input type="submit" name="submit" value="carica file">
</form>

</body>
</html>

aggiungi i marcatori input al tuo form, togli la parte che utilizzi per trasmettere il file e inserisci questo codice php.

Ho fatto come hai detto tu, ho tolto tutto il codice php relativo all'invio del file ed ho inserito quello che mi hai dato e poi ho inserito i codici input nella pagina html del form e quando invio il form mi spedisce la mil ma mi da questo errore e mi arriva solo la parte testuale del form.

Warning: move_uploaded_file(upload/prova.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in D:\Inetpub\webs\analisialfait\mailattachment3.php on line 40

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\PHP\upload\php3F83.tmp' to 'upload/prova.jpg' in D:\Inetpub\webs\analisialfait\mailattachment3.php on line 40
Mail e allegato inviati correttamente torna indietro

la linea 40 è questa:

move_uploaded_file($_FILES["f"]["tmp_name"], "upload/" . $_FILES["f"]["name"]);

ti mando l'intero codice php modificato


PHP:
<?php
// Recuperiamo i valori dal form e aggiungiamo la nostra email dove ricevere il file allegato con la mail
$to = "[email protected]". ", ". "$mail";
$oggetto = "form per l'accesso immediato al prelievo";
$cognome = trim($_POST['cognome']);
$nome = $_POST['nome'];
$datanascita = $_POST['datanascita'];
$luogonascita = $_POST['luogonascita'];
$codicefiscale = $_POST['codicefiscale'];
$indirizzo = $_POST['indirizzo'];
$telefono = $_POST['telefono'];
$cellulare = $_POST['cellulare'];
$tesserasanitaria = $_POST['tesserasanitaria'];
$medicorichiedente = $_POST['medicorichiedente'];
$dataprelievo = $_POST['dataprelievo'];
$area = $_POST['area'];
$testomessaggio = $_POST['testomessaggio'];
$mail = $_POST['mail'];  

$temp = substr($_FILES["file"]["name"], -3);
if ((($_FILES["f"]["type"] == "image/gif")
|| ($_FILES["f"]["type"] == "image/jpeg")
|| ($_FILES["f"]["type"] == "image/jpg")
|| ($_FILES["f"]["type"] == "image/pjpeg")
|| ($_FILES["f"]["type"] == "image/x-png")
|| ($_FILES["f"]["type"] == "image/png")
|| ($temp == "gif")
|| ($temp == "jpg")
|| ($temp == "jpeg")
|| ($temp == "png"))
&& ($_FILES["f"]["size"] < 200000))
  {
if ($_FILES["f"]["error"] > 0)
    {
    echo "errore : " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
move_uploaded_file($_FILES["f"]["tmp_name"], "upload/" . $_FILES["f"]["name"]);
}
}else{
echo "tipo di file non valido";
}   
  
  // Questa è la parte "testuale" del messaggio
  $body .= "Cognome: " . $cognome . "\n\n";
  $body .= "Nome: " . $nome . "\n\n";
  $body .= "Data di nascita: " . $datanascita . "\n\n";
  $body .= "Luogo di nascita: " . $luogonascita . "\n\n";
  $body .= "Codice Fiscale: " . $codicefiscale . "\n\n";
  $body .= "Indirizzo: " . $indirizzo . "\n\n";
  $body .= "Telefono: " . $telefono . "\n\n";
  $body .= "Cellulare: " . $cellulare . "\n\n";
  $body .= "Numero Tessera Sanitaria: " . $tesserasanitaria . "\n\n";
  $body .= "Medico richiedente: " . $medicorichiedente . "\n\n";
  $body .= "Data in cui intendo effettuare il prelievo: " . $dataprelievo . "\n\n";
  $body .= "Luogo in cui si intende effettuare il prelievo: " . $area . "\n\n";
  $body .= "Esami da effettuare: " . $testomessaggio . "\n\n";
  $body .= "Indirizzo e-mail al quale inviare i risultati: " . $mail . "\n\n";
  
// Invio la mail
if($cognome=="")
{echo "non hai inserito il cognome "; }else
if($nome=="")
{echo "non hai inserito il nome "; }else
if($datanascita=="")
{echo "non hai inserito la tua data di nascita "; }else
if($luogonascita=="")
{echo "non hai inserito il luogo di nascita "; }else
if($codicefiscale=="")
{echo "non hai inserito il codice fiscale "; }else
if($indirizzo=="")
{echo "non hai inserito l'indirizzo "; }else
if($tesserasanitaria=="")
{echo "non hai inserito il numero della tessera sanitaria "; }else
if($dataprelievo=="")
{echo "non hai inserito la data in cui intendi effettuare il prelievo "; }else
if($area=="")
{echo "area "; }else
if($testomessaggio=="")
{echo "non hai inserito gli esami da effettuare "; }else
if($mail=="")
{echo "non hai inserito l'indirizzo e-mail al quale inviare i risultati "; }

else
if (mail($to, $oggetto, $body, $headers))
{
  echo "<em>Mail e allegato inviati correttamente </em>";
}{
echo "<em>torna indietro</em>";
}
?>

<br /><br /><br /><br />
<div style="font-family:arial, verdana;text-align:center;width:100%;"><?=$messaggio?></div>
<p align="center"><input name="newmail" type="button" lang="it" onClick="javascript:history.back()" value="Torna Indietro" /></p>
 
Ultima modifica di un moderatore:
ciao
io userei per ricavare l'estensione
PHP:
$temp =strtolower(pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION));//in alcuni casi l'estensione è es .JPG
anche perchè con
PHP:
$temp = substr($_FILES["file"]["name"], -3);
se l'estenzione è .jpeg ricavo peg

poi
1) non ripetete con quote il codice postato da altro utente
2) il codice semppre tra gli appositi bcccode
 
Ultima modifica:
ciao
io userei per ricavare l'estensione
PHP:
$temp =strtolower(pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION));//in alcuni casi l'estensione è es .JPG
anche perchè con
PHP:
$temp = substr($_FILES["file"]["name"], -3);
se l'estenzione è .jpeg ricavo peg

poi
1) non ripetete con quote il codice postato da altro utente
2) il codice semppre tra gli appositi bcccode

Ciao Borgo Italia
ho provato a modificare il codice come mi hai suggerito ma non mi invia l'allegato mi dice tipo di file non valido.
vi prego aiutatemi perchè non so come fare.
Vi ringrazio anticipatamente
 
ciao
ho dato solo un'indicazione, non ho guardato tutto il codice.
comunque una cosa, abbandona la funzione mail e passa alla classe phpmailler https://www.mrw.it/php/inviare-email-classe-phpmailer_7047.html
che permette di inviare allegati comodamente sensa tutto quell'ambaradan di mail che tra l'altro non funziona con certi servizi di posta.

poi non hai letto tutto quello che ho scritto
1) non ripetete con quote il codice postato da altro utente
 
Ma che sappia io per phpmailer ci vuole il server smtp insieme allo spazio web con php senza queste cose non và, quindi se vale ha questi server phpmailer lo può utilizzare senò no... Io non conosco server web free che ti permette di utilizzare smtp... Se qualcuno ne conosce uno lo ringrazio in anticipo per l'info???

Si funziona lo script che ho postato ti conviene per il controllo delle estensioni utilizzare quello scritto da borgoitaliano , cambiando la chiave del vettore file .
 
cioè potresti essere più esplicito nella risposta, per phpmailer non serve smtp? potresti far vedere un esempio funzionante con il relativo link della libreria php, dato che non è una funzione nativa del php?
 
cioè potresti essere più esplicito nella risposta, per phpmailer non serve smtp? potresti far vedere un esempio funzionante con il relativo link della libreria php, dato che non è una funzione nativa del php? smtp è un protocollo che si basa sul livello tcp, quindi no cambia se viene usato in locale o in remoto.
 
ciao
ecco come lo uso
PHP:
<?php
//.....
require "phpmailler/class.phpmailer.php";//richiamo la classe
		$Emailmessaggio = new PHPmailer();
		//e la instanzio
		$Emailmessaggio->SetLanguage('it','language/');//QUESTA PARTE E' COMMENTATA ED E' QUELLA CHE NON HO CARICATO
		//LA DECOMMENTO IN LOCALE PER INVIARE DA LOCALE
		//per inviare da locale o SMTP*** INIZIO*************************************************************
		//$Emailmessaggio->IsSMTP();  // send via SMTP
		//$Emailmessaggio->Host     = "smtp.pinco_pallo.it"; // SMTP servers
		//$Emailmessaggio->SMTPAuth = true;     // turn on SMTP authentication
		//$Emailmessaggio->Username = "pallino_sempronio";  // SMTP username
		//$Emailmessaggio->Password = "pancrazio"; // SMTP password
		//per inviare da locale o SMTP *** FINE***************************************************************
		$Emailmessaggio->IsHTML(true); // invio l'email in formato HTML
		$Emailmessaggio->FromName=$nome_F;
		$Emailmessaggio->Subject=$oggetto_F;
		$Emailmessaggio->From=$email_F;
		$Emailmessaggio->AddAddress($destinatario);
		$Emailmessaggio->AddReplyTo($email_F,"");
		$Emailmessaggio->Body=$invio_il_testo;
		$Emailmessaggio->AltBody="client non settato a ricevere HTML";
		if($allegare !=""){
			$Emailmessaggio->AddAttachment($allegare);
		}
		//fine preparazione del corpo dell'email e allegato
		//invio l'email
		if(!$Emailmessaggio->Send()){ //errore di trasmissione
  			$messaggio_OK_KO=$noinvio_mess[$l];
		}else{ //invio avvenuto
  			$messaggio_OK_KO=$siinvio_mess[$l];
		}//fine if-else invio
//...
?>
come puoi notare la parte smtp è commentata
 
Ultima modifica:
Si ma tu lo stai utlilizzando su aruba ... non è un server free ... i conti non mi tornano ... neanche sulla facenda del smtp che lo si può dessettare ... smanettando su google tutti lo usano ...
 
ciao
da che ne so effettivamente non tutti i free lo permettono, anzi credo che non permettano nemmeno phpmailer o similari.
poi che tutti lo usino può essere, su aruba al contrario se metti l'smtp non funziona, sensa si (ti ho dato il link funzionanti e senza smtp)
 

Discussioni simili