aggiunta modulo invio allegati a form mail

Pr3z1oso

Nuovo Utente
6 Giu 2007
18
0
0
Ciao ragazzi, avrei bisogno del vostro aiuto.
Ho un form che ho terminato ma mi è stato chiesto anche l'invio di un allegato, quasi sicuramente sarà un allegato .doc o comunque un documento testuale. Ho provato i vari script trovati online ma non sono riuscito a venirne a capo, chiedo quindi un vostro aiuto gentilmente.
il codice della pagina php collegata al form è questo:

<?php
$ip=@$REMOTE_ADDR;

$where_form_is="http://".$_SERVER['SERVER_NAME'].strrev(strstr(strrev($_SERVER['PHP_SELF']),"/"));

session_start();
if( ($_SESSION['security_code']==$_POST['security_code']) && (!empty($_POST['security_code'])) ) { $header .="From: $field_6"; //qsta riga serve per fare in modo che $mail sia visto cm mittente
mail("[email protected]","Candidatura 'Lavora Con Noi'","Dati del candidato:

Titolo: " . $_POST['field_16'] . "
Nome: " . $_POST['field_14'] . "
Cognome: " . $_POST['field_2'] . "
Cittadinanza: " . $_POST['field_3'] . "
Residenza: " . $_POST['field_4'] . "
Domicilio: " . $_POST['field_17'] . "
Recapito telefonico principale: " . $_POST['field_5'] . $_POST['field_18'] ."
Recapito telefonico secondario: " . $_POST['field_19'] . $_POST['field_21'] ."
Indirizzo mail: " . $_POST['field_6'] . "
Azienda di interesse: " . $_POST['field_22'] . "
Area aziendale di interesse: " . $_POST['field_23'] . "
Studio/Livello Raggiunto: " . $_POST['field_24'] . "
Carriera/Livello Raggiunto: " . $_POST['field_25'] . "
Esperienza di lavoro: " . $_POST['field_26'] . "
Esperienza di management: " . $_POST['field_27'] . "
Esperienza di project leadership: " . $_POST['field_28'] . "
Posizione desiderata: " . $_POST['field_9'] . "
Hobbies e passioni: " . $_POST['field_7'] . "
Annotazioni: " . $_POST['field_12'] . "
Lettera di presentazione/Curriculum: " . $_POST['field_13'] . "
Privacy: " . $_POST['field_1'] . "

IP: " . $ip . "

",$header);

include("conferma.html");
}
else {
echo "Codice di sicurezza errato . Torna indietro..";
}

?>

Spero possiate aiutarmi... non so come fare. Grazie.
 

Pr3z1oso

Nuovo Utente
6 Giu 2007
18
0
0
l'avevo provato ma ho trovato difficoltà nel sistemare la parte php nella mia pagina php. puoi darmi una mano ?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
Ciao
Per caricare un file per prima cosa devi mettere le mani sul form di invio

<form action="tua_pagina.php" method="post" name="form" id="form" enctype="multipart/form-data">

E inserirci l’input per il file

<input name="da_all" type="file" id="da_all" value="">

Poi devi mettre nella pag php i vari
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];

tra l’altro noto che non fai nessun controllo dei veri post, quandi qualcuno potrebbe inviarti tutte le porcherie che vuole
comunque crei con i concatenamento che hai fatto il messaggio da inviare (mettento gli a capo che servono)

$me=”Dati del candidato:<br>”:
$me .=”Titolo: “.$_POST['field_16'].”<br>”;
Eccetera…..

poi ti scarichi la classe phpmailler al link
http://phpmailer.worxware.com/ (penso che ti convenga qualla per php 5/6)

PHP:
//la carichi nel tuo php

require_once "phpmailler/class.phpmailer.php";

//e la istanzi
$messaggio = new PHPmailer();

//e metti a posto alcuni parametri

$messaggio->SetLanguage('it','language/'); //messo italiano, ma la scelta è vasta
$messaggio->IsHTML(true); // invio l'email in formato HTML

//e i dati da inviare
$lmessaggio->FromName= $nome_del_mittente;
$messaggio->From=$email_del_mittente;
$messaggio->AddAddress($email_del_destinatario;);
$messaggio->Subject=”lavora con noi”;
$messaggio->Body=$me;//il messaggio che ho preparato prima
$messaggio ->AddAttachment($allegato_name);      // carica allegato (fai delle prove)

if(!$mail->Send()){ //invio 
   echo "Il Messaggio non è stato inviato <br>";
   echo "Mailer Error: " . $mail->ErrorInfo;
   exit;
}else{
	echo "Il Messaggio è stato inviato, sarai contattao quanto prima";
}
comunque su google trovi molti esempi e tutorial sulla classe
 

Pr3z1oso

Nuovo Utente
6 Giu 2007
18
0
0
il controllo lo faccio sull'altro file.
ho forse risolto in parte, riesco ad inviare l'allegato ma solo quelli piu "leggeri". ho provato un .txt e arriva, un .doc invece no ( pesa 93kb) alchè ne ho allegato un .doc vuoto e mi arriva...
cme potrei risolvere?
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
il problema non dovrebbe essere di PHP ma del Web server, probabilmente la direttiva upload_max_filesize è settata su un valore molto ridotto.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
intanto caricati sul server e lancia questo semplice script

PHP:
<?php
phpinfo();
?>
e vai a vedere il valore della direttiva che ti ha indicato eliox
dovresti trovarla tra le
Configuration
PHP Core

(le direttive sono in ordine alfabetico)
 

Pr3z1oso

Nuovo Utente
6 Giu 2007
18
0
0
grazie della dritta borgo.
ho visto il campo che mi richiedevate ed eccolo:
upload_max_filesize 64M 64M
mi riporta 64 M in entrambe le colonne... x cosa sta la M ?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
M sta per mega, da qui un mio piccolo dubbio:
l'hai provato in locale? o l'hai caricato in remoto e l'hai fatto girare in remoto?
ti chiedo questo perchè, credo, 64M (circa 64000 kB) è il valore che si trova in locale, è difficile che il tuo provider permetta tale grandezza
 

Pr3z1oso

Nuovo Utente
6 Giu 2007
18
0
0
provato sempre online, mai in remoto.. non aveva senso.
cmq sul server attuale, che era diverso da quello di ieri, funziona alla perfezione.
vi ringrazio quindi, sperando di non avere ulteriori problemi :)
 

LorenzoC

Nuovo Utente
9 Mar 2012
14
0
0
File allegato vuoto nelle mail spedite in PHP

Buonasera a tutti,
vorrei rispolverare questa vecchia discussione in quanto anch'io sto sperimentando lo stesso sgradevole problema:
quanto invio le email tramite php, il file allegato arriva in bianco (nel caso di .doc o .txt) oppure non apribile in caso di pdf (e un messaggio di errore riporta che il file è corrotto o non è stato codificato o decodificato correttamente).

Il problema dell'altro utente calzava proprio come il mio... solo che non sono stato così fortunato come lui: non si è risolto "da solo". ;p

Per riportare meglio la mia situazione, specifico subito che sto eseguendo le prove direttamente online, su server Linux con PHP aggiornato alla v.5.3.10 e la voce upload_max_filesize ammonta a 25M.

Per quanto riguarda il codice invece: il form html è corretto ed è presente enctype="multipart/form-data".
Il codice PHP è il seguente:
PHP:
<?php
// Recupero il valore dei campi del form
$destinatario = "email del destinatario";
$mittente = "email del mittente";
$oggetto = "oggetto della mail";
$messaggio = "messaggio di prova";

// Valorizzo le variabili relative all'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];

// Creo 2 variabili che riempirò più avanti...
$headers = "From: " . $mittente;
$msg = "";

// Verifico se il file è stato caricato correttamente via HTTP
// In caso affermativo proseguo nel lavoro...
if (is_uploaded_file($allegato)) {

  // Apro e leggo il file allegato
  $file = fopen($allegato,'rb');
  $data = fread($file, filesize($allegato));
  fclose($file);
  echo filesize($allegato);
  
  // Adatto il file al formato MIME base64 usando base64_encode
  $data = chunk_split(base64_encode($data));

  // Genero il "separatore"
  // Serve per dividere, appunto, le varie parti del messaggio.
  // Nel nostro caso separerà la parte testuale dall'allegato
  $semi_rand = md5(time());
  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
  
  // Aggiungo le intestazioni necessarie per l'allegato
  $headers .= "\nMIME-Version: 1.0\n";
  $headers .= "Content-Type: multipart/mixed;\n";
  $headers .= " boundary=\"{$mime_boundary}\"";

  // Definisco il tipo di messaggio (MIME/multi-part)
  $msg .= "This is a multi-part message in MIME format.\n\n";

  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Questa è la parte "testuale" del messaggio
  $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
  $msg .= "Content-Transfer-Encoding: 7bit\n\n";
  $msg .= $messaggio . "\n\n";

  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Aggiungo l'allegato al messaggio
  $msg .= "Content-Disposition: attachment;\n";
  $msg .= " filename=\"{$allegato_name}\"\n";
  $msg .= "Content-Transfer-Encoding: base64\n\n";
  $msg .= $data . "\n\n";

  // chiudo con il separatore
  $msg .= "--{$mime_boundary}--\n";
} else {
  $msg = $messaggio;
}

// Invio la mail
if (mail($destinatario, $oggetto, $msg, $headers)) {
  echo "<p>Mail inviata con successo!</p>";
}else{
  echo "<p>Errore!</p>";
}

phpinfo();

exit;
?>

Forse visto l'errore di codifica/decodifica di Acrobat Reader c'è qualche istruzione incorretta o mancante tra gli Header Content-Type, Content-Transfer, Content-Disposition, ma in questa materia sono abbastanza scarso...

Grazie a tutti in anticipo per l'attenzione ed il tempo dedicato! ^_^
Cordialmente
Lorenzo
 
Ultima modifica:

LorenzoC

Nuovo Utente
9 Mar 2012
14
0
0
Ciao e grazie della risposta!
Mi sono letto l'articolo: non ho problemi a cambiare sistema di invio, l'importante è raggiungere il risultato.

Riporto per comodità la parte di codice dell'articolo riguardante gli allegati
PHP:
<?
require "phpmailer/class.phpmailer.php";
$messaggio = new PHPmailer();
$messaggio->IsSMTP();
$messaggio->Host='Host SMTP';
$messaggio->From='[email protected]';
$messaggio->AddAddress('[email protected]');
$messaggio->AddReplyTo('[email protected]'); 
$messaggio->Subject='Email con allegato';
$messaggio->Body='Invio file Pdf';

//percorso all'allegato
$messaggio->AddAttachment('pdf/file.pdf');
if(!$messaggio->Send()){
  echo $messaggio->ErrorInfo; 
}else{ 
  echo 'Email inviata correttamente!';
}
$messaggio->SmtpClose();
unset($messaggio); 
?>

L'unico passaggio che non mi è chiaro è $messaggio->AddAttachment('pdf/file.pdf'); : secondo voi qui il percorso del file andrebbe sostituito con $_FILES['allegato']['tmp_name']?

Ho fatto delle prove ma escono fuori due problemi:
1) Fatal error: Cannot access empty property in /percorso_mio/phpmailer/phpmailer.inc.php on line 271
La riga incriminata è $header[] = sprintf("Content-Transfer-Encoding: %s\n", $this->$Encoding); ma non capisco perchè dica che la proprietà è vuota dato che la variabile Encoding è definita (var $Encoding = "8bit";)
2) Provando a commentare la riga 271 di errore, le email partono ma l'allegato che arriva è un file stranissimo chiamato phpBK9fRs.dat

Vi è mai capitato nulla del genere?
Grazie ancora
Lorenzo
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
io faccio in questo modo (leggi i commenti)
PHP:
<?php
//.....
//prima mi sono fatto delle funzioni di verifica
//a fincho c'è il campo che andrà inserito nella function
function tipi_ammessi($file){//$_FILES['foto_1']['name']) IMPORTANTE altrimenti ti possono inviare un .exe poco piacevole
	//elenco in array i tipi ammessi
	$tipo=array('jpg', 'JPG','gif','png');//qui puoi aggiungere .pdf o es. .zip .doc.... e togliere quello che non ti serve
	//ricavo il nome del file
	$file=pathinfo($file, PATHINFO_BASENAME);
	//ricavo l'estensione del file
	$estensione=pathinfo($file, PATHINFO_EXTENSION); 
	//verifico che l'estensione sia tra i tipi ammessi
	if(in_array($estensione,$tipo)){
		return TRUE;//l'estensione è consentita
	}else{
		return FALSE;//file con estensione non consentita
	}
}//fine function verifica tipi di file
function grandeza_ammessa($file,$bit){//$_FILES['foto_1']['size']) la grandezza deve essere in bit numero intero
	if($file <= $bit){
		//piu piccolo dell'ammesso
		return TRUE;
	}else{
		//file troppo grande
		return FALSE;
	}
}//fine function gradezza
function file_da_allegare($file_nome, $file_tmp){//$_FILES['foto_1']['name'], $_FILES['foto_1']['tmp_name']
	//ricavo il nome del file e del temp cone gli eventuali percorsi
	$nome_file=pathinfo($file_nome, PATHINFO_BASENAME);
	$nome_file_temp=$file_tmp;
	//rivavo il percorso temporaneo con + slash finale
	$cartella_temp=pathinfo($nome_file_temp, PATHINFO_DIRNAME);
	//aggoungo lo slash in funzione del so
	if (strpos($cartella_temp, '/') !== false){
		$cartella_temp.= "/";
	}else{
		$cartella_temp.= "\\";
	}
	//e ricavo il nome del file da allegare con il suo percorso
	$da_allegare=$cartella_temp.$nome_file;
	//uploado e verifico
	if(move_uploaded_file($nome_file_temp, $da_allegare)){
		return $da_allegare;//file caricato in cartella temporanea e nome da indicare a PHPmailler
	}else{
		return FALSE;//c'è stato un errore
	}
}//fine function file da allegare
//...........
//verifico se estenzione ammessa e grandezza del file
//se le verifiche sono andate a buon fine ricavo il nome del file da allegare
//poi tutt al'istanzazione della phpmailler.....
$allegare=file_da_allegare($_FILES['foto_1']['name'],$_FILES['foto_1']['tmp_name']);
//se ritorna false alle varie functio do un messaggio e faccio ripartire
//.......
		if($allegare !=""){//ho messo l'if perche ho avuto problem se non allego nulla
			$messaggio->AddAttachment($allegare);
		}
//......
?>
spero che sia comprensibile
 

LorenzoC

Nuovo Utente
9 Mar 2012
14
0
0
Grazie Borgo,
il tuo codice mi è stato d'aiuto, ora gli allegati non arrivano più corrotti e non apribili.

Vorrei segnalare a tutti quelli che come me hanno avuto problemi ad integrare i vari sistemi per allegare i file con il proprio codice, di porre la massima attenzione alle virgolette, gli spazi, i punti e virgola ed i ritorni a capo di questi delicati punti:

PHP:
Content-Type: multipart/mixed; boundary="PHP-mixed-"<?php echo $random_hash; ?>"

--PHP-mixed-<?php echo $random_hash; ?> 
Content-Type: <?php echo $file['type']; ?>; name="<?php echo $upload; ?>" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

<?php echo $attachment; ?>
--PHP-mixed-<?php echo $random_hash; ?>--

e chiaramente alla codifica/decodifica del file:
PHP:
$attachment = chunk_split(base64_encode(file_get_contents($percorso_f.$upload)));

Saluti
Lorenzo
 
Discussioni simili
Autore Titolo Forum Risposte Data
M Aggiunta prodotti nel carrello con lo stesso in e varianti diverse PHP 0
D [HTML] scorrimento dopo un'aggiunta di dati HTML e CSS 5
S [OFFRO] Rimozione o aggiunta di Password ai file PDF e opzionalmente loro modifica Offerte e Richieste di Lavoro e/o Collaborazione 2
zorro Aggiunta di immagini al sito Leggi, Normative e Fisco 0
T PHP: aggiunta a query che non so fare... PHP 2
A [Javascript] Mancata aggiunta di una classe al click Javascript 1
M Aggiunta funzionalità script php Regione Provincia Comune PHP 1
F Aggiunta div ultimi 4 post WordPress 1
L Google maps aggiunta makers da php Javascript 4
J Aggiunta di un effetto di transizione al plugin Quick Pager jQuery 0
C Aggiunta nuovo ruolo utente e impossibile modificare le pagine WordPress 7
L innerHTML aggiunta di campi Javascript 2
G Form con aggiunta righe PHP 3
P rilevare dati db e inserirli in tabella con aggiunta form PHP 23
I aggiunta fotogrammi Flash 5
C Hosting Aruba Aggiunta certificati Hosting 4
S mini-community con aggiunta amici PHP 4
F aggiunta campi commenti wordpress WordPress 1
T java-aggiunta cartelle JTree Java 0
F domande su active directory e aggiunta di pc ad una rete.. Reti LAN e Wireless 0
M aggiunta di checkbox obbligatorio Classic ASP 2
P aggiunta pagine disastroso PHP 6
B Counter: aggiunta conteggio tempo su video Flash 1
L Tag HTML per aggiunta immagini in TextArea Flash 1
Z Accesso amministratori, aggiunta testo e creazione di link con ancora PHP 0
G slide immagini + aggiunta funzioni STOP E RIPRENDI Javascript 0
A Aggiunta RAM: problemi ... Hardware 2
L cerco programma stile teleport... ma con un aggiunta.. Discussioni Varie 0
G flask, aggiunta link Flash 21
Maverick1000tt Aggiunta filmato Flash 1
C aggiunta dinamica di una tabella senza ridirezione Javascript 3
L Aggiunta di nuovi script e spiegazione in ITA Supporto Mr.Webmaster 5
I modulo contatti PHP 1
zorro modulo di registrazione: funziona ma non sempre PHP 2
L Ricezione dei dati su file php da modulo html PHP 6
A Creare un modulo di ricerca avanzata con dreamweaver HTML e CSS 0
R passaggio variabili tra modulo genitore a figlio jQuery 3
C prestashop paragamento contrassegno aiuto modulo E-Commerce 0
S Problemi con modulo upload video php (help!) PHP 0
ANDREA20 [PHP] Modulo email invio PHP 5
ANDREA20 [PHP] form modulo contattp PHP 5
V [Visual Basic] Richiamare funzione su modulo per restituire list Visual Basic 0
A [PHP] Modulo mail PHP 3
B Errore PDOException: SQLSTATE[42000] modulo aggiuntivo Drupal CMS (Content Management System) 0
Eugene [Joomla] Problemi con modulo per strutture alberghiere JHotelreservation starter Joomla 6
L [ASP.Net] Realizzare modulo contatti PopUp ! ASP.NET 1
K Joomla: Modulo contatti in SP simple portfolio Joomla 0
F [HTML] Modulo d'ordine che arriva tramite email editabile ed inviabile. HTML e CSS 6
P modulo option php PHP 1
T [PHP] modulo inserimento in DB e apostrofi... PHP 1

Discussioni simili