Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178

    form invio mail, lettere accentate

    ho poca o nulla conoscenza del codice ma volevo comunque implementare un form di invio mail nella pagina "contatti" del mio portfolio(http://xxxx.it/ ), ho scaricato un form esempio che ho trovato su MMKit, mi sono armato di un pò di pazienza e ci ho smanettato finchè non ho capito più o meno come funzionava e ho modificato i campi di mio interesse lasciando intatto il funzionamento...

    funziona tutto perfettamente, sia il testo di "riscostro" dopo l'invio che il testo del messaggio che arriva alla mia casella di posta vengono visualizzati correttamente,

    l'unica cosa a non essere correttamente visualizzata sono le lettere accentate nel messaggio di conferma che arriva al mittente del form, ho provato cambiando la codifica dei caratteri, dove fosse specificata con charset=iso-8859-1, in charset=UTF-8, ma niente, quì di seguito il codice...

    codice:
    <?
    
    if ($op=="invio") {
    	$error=0;
    	$msg="";
    	if ($nome=="") {
    		$error=1;
    		$msg.="- Il campo nome è vuoto.
    ";
    	}
    	if ($cognome=="") {
    		$error=1;
    		$msg.="- Il campo oggetto è vuoto.
    ";
    	}
    	if ($email=="") {
    		$error=1;
    		$msg.="- Il campo e-mail è vuoto.
    ";
    	}
    	if ($email!="" && !eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$",$email)) {
    		$error=1;
    		$msg.="- L'e-mail inserita non è valida.
    ";	
    	}
    	if ($commento=="") {
    		$error=1;
    		$msg.="- Il campo messaggio è vuoto.
    ";
    	}
    	$error_file="";
    	if ($error==1 || $error_file!="") {
    		echo"
    
    Attenzione! Si sono verificati i seguenti errori:
    $msg
    $error_file
    <a href=\"javascript:history.back()\">Clicca qui</a> per inserire i dati.";	
    	} else {
    		$emailto="xxx@xxx.it"; // INERIRE L'EMAIL QUI!!
    
    		
    		$headers = "MIME-Version: 1.0\n";									// INVIATA A ME!!
    		$headers .= "Content-Type: multipart/mixed; boundary=\"XX-1234DED00099A\"\n";
    		$headers .= "Content-Transfer-Encoding: 7bit\n";
    		$headers .= "From: $email\n";
    		
    		$messaggio.="--XX-1234DED00099A\n";
    		$messaggio.="Content-Type: text/plain; charset=UTF-8\n";
    		$messaggio.="Content-Transfer-Encoding: 7bit\n\r";
    		
    
    		$messaggio.="Dati inseriti\n";
    		$messaggio.="Nome: $nome\n\rOggetto: $cognome\n";
    		$messaggio.="E-mail: $email\nMessaggio:\n$commento\n";
    		$oggetto_send="Webmaster - 3D Portfolio";
    		
    		if (!mail($emailto, $oggetto_send, $messaggio, $headers)) {
    			echo"
    Attenzione.
    Si sono verificati degli errori durante l'invio della Email.
    
    			Riprovare di nuovo <a href=\"javascript: history.back()\">cliccando qui.</a>
    
    			Se l'errore persiste riprovare più tardi. Grazie.";
    		}
    		else {
    		
    			$messaggio_risposta.="--XX-1234DED00099A\n";							// INVIATA A TERZI!!
    			$messaggio_risposta.="Content-Type: text/plain; charset=UTF-8\n";
    			$messaggio_risposta.="Content-Transfer-Encoding: 7bit\n\r";
    			
    			$messaggio_risposta="Grazie per avermi contattato.\n\rIl messaggio e' stato inoltrato, rispondero' appena possibile.\n\r\n\rDati inseriti\n";
    			$messaggio_risposta.="Nome: $nome\n\rOggetto: $cognome\n\r";
    			$messaggio_risposta.="Messaggio:\n\r$commento\n\r\n\r";
    			$messaggio_risposta.="Distinti saluti.\n\r";
    			$oggetto2="Messaggio inoltrato";
    			mail($email, $oggetto2, $messaggio_risposta,"From: TeraBIT <$emailto>");
    			
    			echo "
    E-mail inviata correttamente.
    
    			
    I dati inseriti sono i seguenti:
    
    ";
    			echo"Nome: $nome 
    
    			Oggetto: $cognome
    ";
    			echo"E-mail: $email
    Messaggio:
     ".nl2br($commento)."
    
    			
    
    Grazie per avermi contattato, rispondero' appena possibile.";
    		}
    	}
    	
    } else {
    ?>

    ho provato anche inserendo a capo del codice una funzione che dovrebbe sostituire i caratteri mal interpretati con lettere apostrofate ma neanche quello funziona, probabilmente perchè il corpo del messagio nel corpo del php non è che una variabile facente riferimento alla text area per cui non ne processa il contenuto, almeno credo...

    codice:
    <?
    
    function togliaccenti($stringa)
    {
    $stringa=str_replace("Ã*","a'",$stringa);
    $stringa=str_replace("è","e'",$stringa);
    $stringa=str_replace("é","e'",$stringa);
    $stringa=str_replace("ì","i'",$stringa);
    $stringa=str_replace("ò","o'",$stringa);
    $stringa=str_replace("ù","u'",$stringa);
    return $stringa;
    }
    l'errore è presente anche nel file orginale, insomma non è comparso dopo l'ho modificato,
    spero possiate risolvermi questo "dettaglio" altrimenti dovrò cancellare la parte di codice incaricata di riportare il contenuto del messagio spedito, e mi dispiacerebbe...

    grazie per la vostra attenzione
    è troppo impegnativo...

  2. #2
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178

    ...

    no one?
    è troppo impegnativo...

  3. #3
    Utente bannato L'avatar di Ht28
    Registrato dal
    May 2006
    Messaggi
    1,544
    Inanzitutto devi tenere charset=iso-8859-1 e metti questo

    Codice PHP:
    $headers  "MIME-Version: 1.0\r\n";
    $headers .= "content-type: text/html; charset=iso-8859-1\r\n";
    $headers .= "X-Mailer: PHP\n"
    $headers .= "From:IO<io@alice.it>\n"

  4. #4
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178

    form risolto, download no...

    grazie della risposta, poi sono riuscito a risolvere da solo, cmq il problema era proprio il char-set della mia pagina che non coincideva con quello del server(evidentemente non ha uft-8), le cose dopo si sono complicate perchè sono comparsi dei backslash nel messagio ma ho risolto aggiungendo lo stripslash nel codice, ora và che è una favola.


    il mio problema adesso è un altro, facendo ricerche ho trovato su questo sito il seguente codice per scaricare un file di qualunque tipo cliccando direttamente sul collegamento senza che questo venga aperto nel browser :

    codice:
    <?    
        $filename = $_GET["filename"];
        $buffer = file_get_contents($filename);
    
        /* Force download dialog... */
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
    
        /* Don't allow caching... */
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    
        /* Set data type, size and filename */
        header("Content-Type: application/octet-stream");
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: " . strlen($buffer));
        header("Content-Disposition: attachment; filename=$filename");
    
        /* Send our file... */
        echo $buffer; 
    ?>

    il file scaricato mantiene il suo nome e funziona, l'unica pecca è che il browser non vede la dimensione del file, ho provato anche a rimpiazzare strlen con filesize o con un variabile richiamata dopo aver eseguito filesize($filename) ma non ne vuole sapere!

    sono solo 10 righe e le istruzioni(incredibile ma vero) mi sembrano chiarissime e precise, dal mio punto di vista gli dò un comando coretto e non lo esegue, non riesco a capire dove sia l'errore, ho cercato dappertutto e le ho provate tutte ma niente, ho provato a eseguire questo codice al posto del downloader e la dimensione del file in byte viene correttamente visualizzata nel browser:

    codice:
    <?php
     $filename = $_GET["filename"];
     
     
     echo filesize($filename);
    
    ?>
    li ho provati in IE 7, Opera 9.5 e Firefox 3 e in tutti e tre si comportano allo stesso modo...

    non sò che pesci prendere, attendo consigli/alternative, grazie...
    è troppo impegnativo...

  5. #5
    la butto là..

    credo che:

    header("Content-Length: " . strlen($buffer));

    sia sbagliata...

    strlen non ti restituisce niente se non è una stringa.. e tu gli passi un buffer...

    se vuoi la dimensione, mi viene in mente questo sistema, se ce ne sono altri, tanto meglio, però intanto prova così:

    ob_start();
    echo $buffer;
    $dimensione = ob_get_length();
    ob_end_clean();

    Ora in $dimensione hai la dimensione giusta....

    Metti queste 4 righe prima di:
    header("Content-Length: " . $dimensione);

    e vedrai che và... (il resto del codice non lo toccare però... .. in sostanza diventa così:

    Codice PHP:
    <?    
        $filename 
    $_GET["filename"];
        
    $buffer file_get_contents($filename);

        
    /* Force download dialog... */
        
    header("Content-Type: application/force-download");
        
    header("Content-Type: application/octet-stream");
        
    header("Content-Type: application/download");

        
    /* Don't allow caching... */
        
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

        
    /* Set data type, size and filename */
        
    header("Content-Type: application/octet-stream");
        
    header("Content-Transfer-Encoding: binary");
    //========================================================
    ob_start();
    echo 
    $buffer;
    $dimensione ob_get_length();
    ob_end_clean();
    header("Content-Length: " $dimensione);
    //========================================================
        
    header("Content-Disposition: attachment; filename=$filename");

        
    /* Send our file... */
        
    echo $buffer
    ?>
    ...::: DESIDERARE E' UMANO :::...
    ...::: POSSEDERE E' DIVINO :::...
    ...::: HAVE A NICE DAY :::...
    (¯`·.¸¸.->ĐĮ ĦΞŁŁ<-.¸¸.·`¯)
    http://www.djhellclub.com

  6. #6
    scusami djhell, ma prima di dare consigli, risposte e suggerimenti è BENE verificare le proprie idee e conoscenze

    strlen restituisce la lunghezza di una stringa, $buffer in questo caso che è una variabile contenente una stringa caricata tramite la funzione file_get_contents

    la tua soluzione, probabilmente, funziona, solo che uccidi (nel senso pratico del termine) il server per nel momento in cui fai un echo con le OB attivate lui ha in memoria la variabile $buffer per 2 volte, praticamente! Basta avere un file mp3 di 4/5 mb ed esplode tutto

    detto questo
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");

    non servono, qualche riga dopo risovrascrivi di nuovo l'header content type ^^

    Ti consiglio comunque di mettere l'octet-stream
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  7. #7
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178
    ho provato il consiglio di djhell ma nulla, continua a scaricare il file senza rendere nota la dimensione, e quindi il tempo mancante al termine, il mio codice al momento è il seguente :

    codice:
    <?    
        $filename = $_GET["filename"];
        $buffer = file_get_contents($filename);
    	
    	array (
    
      // archives
      'zip' => 'application/zip',
    
      // documents
      'pdf' => 'application/pdf',
      'doc' => 'application/msword',
      'xls' => 'application/vnd.ms-excel',
      'ppt' => 'application/vnd.ms-powerpoint',
      
      // executables
      'exe' => 'application/octet-stream',
    
      // images
      'gif' => 'image/gif',
      'png' => 'image/png',
      'jpg' => 'image/jpeg',
      'jpeg' => 'image/jpeg',
    
      // audio
      'mp3' => 'audio/mpeg',
      'wav' => 'audio/x-wav',
    
      // video
      'wmv' => 'video/wmv',
      'mpeg' => 'video/mpeg',
      'mpg' => 'video/mpeg',
      'mpe' => 'video/mpeg',
      'mov' => 'video/quicktime',
      'avi' => 'video/x-msvideo'
    );
    
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    
        header("Content-Type: application/force-download");
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: " . strlen($buffer));
        header("Content-Disposition: attachment; filename=$filename");
    
        echo $buffer; 
    ?>

    ho inserito l'array di MIME dopo aver avuto qualche probelma con file wmv quindi li ho specificati e ora non dà più errore(apparte il fatto che ora Firefox dice per ogni tipo di file che si tratta di un WMV, pur visualizzando correttamente l'icona e il tipo di applicazzione...), gli ho estrapolati da quest'altro downloader php che però(come potete intuire) non sono riuscito a utilizzare, il codice è mostruosamente complicato e per di più ci sono dei bug che da quanto ho evinto dai commenti non sono stati risolti...
    ho già provato a farlo andare anche senza l'array di mezzo ma la dimensione non la visualizza
    se dovessi far scaricare solo doc e pdf di pochi kb non mi porrei troppo il problema, ma per un wmv di 13mb e un quicktime di 4mb la cosa diventa fastidiosa

    sono ancora in alto mare....
    è troppo impegnativo...

  8. #8
    a parte che, secondo me, ti sarebbe convenuto parecchio aprire un nuovo thread a riguardo perché avresti trovato persone che ti avrebberò aiutato con maggiore facilità ... detto questo, dato che ormai non si può più, perché non effettuare una ricerchina sul forum invece di disperarsi?

    Giusto qualche giorno fa ho dato una mano ad una persona che aveva problemi per effettuare il download!

    Inoltre l'array di mime type che hai messo, non lo usi ... non lo assegni a nulla ... LOL

    ho riscritto buona parte del codice aggiungendo un controllo e indicando che ne va messo ASSOLUTAMENTE un altro!

    codice:
    <?php
    
    // Verifica che sia passato il parametro
    if (isset($_GET["filename"]) === false)
    {
        // Termina la pagina web
        die('Indicare il nome del file da scaricare!');
    }
    
    // Acquisisce il nome del file
    $filename = $_GET["filename"];
    
    // QUI DEVI EFFETTUARE DEI CHECK DI SICUREZZA ALTRIMENTI CHIUNQUE POTRA' SCARICARSI
    // TUTTO IL SITO CON ESTREMA TRANQUILLITA' PER NON PARLARE POI DEI FILE DI SISTEMA
    // SE IL SAFE MODE E' SPENTO!
    
    // Invia gli header al browser
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Type: application/octet-stream");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . filesize($filename));
    header("Content-Disposition: attachment; filename=\"$filename\"");
    
    // Apre il file
    $fp = fopen($filename, 'rb');
    
    // Legge il file a blocchi da 8kb e lo invia al browser
    while(feof($fp) === false)
    {
        // Invia il contenuto al browser
        echo fread($fp, 16384);
    }
    
    // Chiude il file precedentemente aperto
    fclose($fp);
    
    ?>
    L'ho ottimizzato parecchio, oltre ad averlo risistemato sintatticamente. Ora come ora scarica tranquillamente un file di 400mb (quasi) a circa 7mb/s (in locale ovviamente)
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.