aggiunta modulo invio allegati a form mail

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("xxx@mail.it","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... Grazie.

inviato 6 anni fa
Pr3z1oso
modificato 6 anni fa
Mario Santagiuliana
X 0 X

Se devi inviare un allegato. Prima devi fare un upload del file sul tuo server (magari usando ajax così l'esperienza utente è migliore) e poi crei la tua email e la invii.

Se stai su un server Linux ed è installato il client email mutt potresti usare quest'ultimo per inviare l'allegato. Altrimenti devi creare tutto il codice con le dovute specifiche.

Attendiamo tue richieste.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

si devo inviare un allegato, con qualsiasi metodo, anche il piu semplice.

mi è stato richiesto alla fine di un form dopo averlo creato già tutto quindi dovrei inserirlo in quest'ultimo.

come posso fare ?

risposto 6 anni fa
Pr3z1oso
X 0 X

Il problema era chiaro dall'apertura della discussione, ti chiedo di rileggere il mio messaggio precedente e di rispondermi.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

non so se il server è win o linux in quanto è gestito tutto esternamente da una società locale.

penso si dovrebbe creare quindi la parte codice riferita alla gestione allegati

risposto 6 anni fa
Pr3z1oso
X 0 X

Dover sviluppare senza sapere su che piattaforma gira il proprio codice non è una scelta felice...ma scusa un test dei tuoi script sul server non li fai direttamente te?

Lasciamo perdere il client mutt allora.

Leggi questo articolo:

http://www.mrwebmaster.it/php/articoli/inviare-email-allegati-usando-php_497.html

risposto 6 anni fa
Mario Santagiuliana
X 0 X

ho provato gia quel link ma ho trovato difficoltà nell'inserire nella pagina php che possiedo la parte di codice interessata per l'upload... in poche parole, non riuscivo a capire dove piazzarla.

puoi darmi una mano gentilmente mario ?

risposto 6 anni fa
Pr3z1oso
X 0 X

Si, non è affatto difficile, sarebbe comunque da sapere su che server gira perchè le path da usare sono differenti su server windows o linux.

Prova a modificare così il tuo codice php:

<?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'])) ) {

$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];

// Creo 2 variabili che riempirò più avanti...
$headers = "From: " . $_POST['field_6'];
$msg = "";

// $messaggio è la variabile contenente l'email che stavi creando te.
$messaggio = "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 . "

";

// 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);

  // 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; //La tua email senza allegato
}



mail("xxx@mail.it","Candidatura 'Lavora Con Noi'", $msg, $header);

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

?>

Devi contestualmente sistemare il tuo form in modo che abbia:

enctype="multipart/form-data"

ed:

<input type="file" name="allegato" />

Il codice però deve essere scritto meglio (indentazione), inoltre è il caso di fare qualche controllo sui dati che vengo passati o no?

In più il codice da te inserito all'inizio contiene errori.

Anche il mio ne contiene e ti consiglio di rileggerlo attentamente.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

nell'altro file, ovvero quello che viene visualizzato a video, c'è già una validazione dei dati inseriti, ho già provveduto a questo, ti ringrazio.

questo codice che mi hai dato per quale server è ? sto provando sia su server win che linux di alcuni siti che dispongo e riscontro problemi nella ricezione. in pratica il messaggio arriva solo che mi arriva cosi:

This is a multi-part message in MIME format.

--==Multipart_Boundary_x6a568df70a66962ef304ae16a4fb8bc7x

Content-Type: text/plain; charset="iso-8859-1"

Content-Transfer-Encoding: 7bit

Dati del candidato:

ecc ecc tutto ok qui

--==Multipart_Boundary_x6a568df70a66962ef304ae16a4fb8bc7x

Content-Disposition: attachment;

 filename="film da scaricare.txt"

Content-Transfer-Encoding: base64

c21va2luJyBhY2VzIDI6IGFzc2Fzc2lucycgYmFsbA0KRm9yZXZlciBTdHJvbmcNCkFubm8gdW5v

IA0KVGhlIGRlYWwtU2V4eSBiYWNrc3RhZ2UNCg0KQWxpY2UgaW4gV29uZGVybGFuZA0KUkFHQVpa

RSBEQSBTQkFMTE8NCkNoZSBmaW5lIGhhbm5vIGZhdHRvIGkgTW9yZ2FuPw0KVGhlIENvbGxlY3Rv

cg0KR2FtZXINCg0KDQpQaWVkZSBkaSBEaW8NCkFmdGVyc2Nob29sDQoNCg0KDQpodHRwOi8vcHIz

ejFvc28uYWx0ZXJ2aXN0YS5vcmcvbGF2b3JpLnR4dA0KDQoNCmh0dHA6Ly9lbGVjdHJvZm9wcGlz

aC5ibG9nc3BvdC5jb20vDQpodHRwczovL3d3dy5iZWF0cG9ydC5jb20vaXQtSVQvaHRtbC9jb250

ZW50L2hvbWUvZGV0YWlsLzEvYmVhdHBvcnQNCnd3dy5mYWNldGhlbXVzaWsubmV0DQpodHRwOi8v

d3d3Lm16aGlwaG9wLmNvbS8NCg0KDQoNCg0KDQoNCg0KDQoNCg0K

--==Multipart_Boundary_x6a568df70a66962ef304ae16a4fb8bc7x--

risposto 6 anni fa
Pr3z1oso
X 0 X

Dovrebbe andare bene sia su win che su linux.

Il problema è riferito alla variabile $header e $headers. Tu precedentemente avevi usato $header, io ho messo $headers e mi son dimenticato di cambiarla nella chiamata alla funzione mail().

Così è giusto:

mail("xxx@mail.it","Candidatura 'Lavora Con Noi'", $msg, $headers);
risposto 6 anni fa
Mario Santagiuliana
X 0 X

mario sei un grande, funziona alla perfezione. c'è un solo problema, non so se facile o difficile.

ho provato con allegato un .txt ed arriva... ma un .doc non arriva proprio la mail ( o almeno non è immediata, ad ora ancora niente ).

bisogna aggiungere qualche altra opzione ?

risposto 6 anni fa
Pr3z1oso
X 0 X

ma un .doc non arriva proprio la mail ( o almeno non è immediata, ad ora ancora niente ).

bisogna aggiungere qualche altra opzione ?

Spiega meglio.

Se il file è grande devi aspettare che sia caricato sul server ed inviato, inoltre ci possono essere dei limiti sull'upload del file e sulla casella che riceverà tale file.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

allora mi spiego meglio.

ho fatto 4 prove in tutto, 2 con allegati .txt e sono arrivate le mail.

altre 2 prove con 2 .doc, la mail non arriva però in questo caso... il .doc pesa 93kb ... è troppo pesante ? come si può risolvere?

risposto 6 anni fa
Pr3z1oso
X 0 X

Non è troppo pesante.

Verifica nei log del tuo server web per capire il problema.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

ho fatto una prova con un nuovo documento word, completamente nuovo, senza nemmeno una lettera, l'ho allegato ed è arrivato... a questo punto forse è proprio questione di peso...

cosa potrei fare ?

risposto 6 anni fa
Pr3z1oso
X 0 X

Non credo che ci siano un blocco a 93 Kb.

Ripeto: controlla i log del server, sono gli unici che ti possono dare qualche informazione.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

come li controllo ? attualmente sto provando questo forum su aruba.. ma il server in cui dovrà funzionare non è aruba.

ho accesso al pannello di controllo di aruba del sito ma nn trovo niente riguardante tali log..

risposto 6 anni fa
Pr3z1oso
X 0 X

Non conosco i serivizi di aruba. Chiedi info a loro e alla loro documentazione.

Spesso si crea un server di sviluppo in locale per creare il proprio codice, da li hai controllo completo per capire cosa non va e cosa potrebbe non andare.

Di più non posso fare non avendo altre informazioni in mano.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

credo che proverò il form direttamente sul server, lunedi, ti terrò aggiornato.

nel mentre ti ringrazio di tutto e per la pazienza  O0

risposto 6 anni fa
Pr3z1oso
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda