[PHP] Comando mail() e lettere accentate

Stato
Chiusa ad ulteriori risposte.

Francesco_72

Nuovo Utente
27 Mag 2016
28
2
3
49
Buongiorno a tutti,
non riesco a venire fuori da questo problema pur avendo letto diverse soluzioni in rete. Lo script che posto di seguito funziona perfettamente per quanto riguarda l'invio di mail con allegato. Unico problema le lettere accentate nel corpo della mail che vengono convertite in modo sbagliato quando l'utente riceve la mail. Vi posto il codice:

Codice:
        // Recupero il valore dei campi del form
        $mittente = $_POST['mittente'];
        $oggetto = $_POST['oggetto'];
        $messaggio = $_POST['messaggio'];
        $destinatario= $_POST['destinatario'];
      
        // Valorizzo le variabili relative all'allegato
        $allegato = $_FILES['allegato']['tmp_name'];
        $allegato_type = $_FILES['allegato']['type'];
        $allegato_name = $_FILES['allegato']['name'];
      
        // Creo altre due variabili ad uno interno
        $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);
      
         // 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; filename=\"{$allegato_name}\"\n";
         $msg .= "Content-Transfer-Encoding: base64\n\n";
         $msg .= $data . "\n\n";
      
         // chiudo con il separatore
         $msg .= "--{$mime_boundary}--\n";
        }
        // se non è stato caricato alcun file
        // preparo un semplice messaggio testuale
        else
        {
         $msg = $messaggio;
        }
      
        // Invio la mail
        mail($destinatario, $oggetto, $msg, $headers)

Sulla pagina ufficiale di PHP ho anche trovato questa funzione (che richiamo subito dopo //Invio mail) che risolverebbe i problemi di accento ma che però me ne crea sull'allegato in quanto non riesce a mandarlo:

Codice:
function mail_utf8($to, $from_user, $from_email, $subject = '(No subject)', $message = '')
   {
      $from_user = "=?UTF-8?B?".base64_encode($from_user)."?=";
      $subject = "=?UTF-8?B?".base64_encode($subject)."?=";

      $headers = "From: $from_user <$from_email>\r\n".
               "MIME-Version: 1.0" . "\r\n" .
               "Content-type: text/html; charset=UTF-8" . "\r\n";

     return mail($to, $subject, $message, $headers);
   }

Qualcuno può dirmi dove sbaglio? Grazie in anticipo
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, hai provato con utf8_decode() ?
Codice:
$msg .= utf8_decode($messaggio) . "\n\n";
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
devi metterlo sulla variabile $messaggio non sulla variabile $msg snno codifichi anche l'allegato
 

Francesco_72

Nuovo Utente
27 Mag 2016
28
2
3
49
devi metterlo sulla variabile $messaggio non sulla variabile $msg snno codifichi anche l'allegato

Io l'ho messo così:
Codice:
.......
 
// chiudo con il separatore
          $msg .= "--{$mime_boundary}--\n";
        }
        // se non è stato caricato alcun file
        // preparo un semplice messaggio testuale
        else
        {
          $msg = $messaggio;
        }
       
        $msg .= utf8_decode($messaggio) . "\n\n";
       
        // Invio la mail
        if (mail($destinatario, $oggetto, $msg, $headers))
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
dovresti metterlo qui
PHP:
// Questa è la parte "testuale" del messaggio
         $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
         $msg .= "Content-Transfer-Encoding: 7bit\n\n";
         $msg .=  utf8_decode($messaggio) . "\n\n";
    
         // Metto il separatore
         $msg .= "--{$mime_boundary}\n";
ma non è detto che funziona dovresti provare
oppure all'inizio
PHP:
$messaggio = utf8_decode($_POST['messaggio']);
in ogni caso solo sul testo
 

Francesco_72

Nuovo Utente
27 Mag 2016
28
2
3
49
dovresti metterlo qui
PHP:
// Questa è la parte "testuale" del messaggio
         $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
         $msg .= "Content-Transfer-Encoding: 7bit\n\n";
         $msg .=  utf8_decode($messaggio) . "\n\n";
   
         // Metto il separatore
         $msg .= "--{$mime_boundary}\n";
ma non è detto che funziona dovresti provare
oppure all'inizio
PHP:
$messaggio = utf8_decode($_POST['messaggio']);
in ogni caso solo sul testo

PERFETTO!! Grazie mille. In pratica ho usato la tua seconda opzione ed ha funzionato benissimo. L'unico problema riguardava eventuali accenti nell'oggetto. Usando la stessa procedura l'oggetto usciva bene ma il testo del messaggio di nuovo in modo sbagliato. Ho risolto mettendo quest'altro codice all'oggetto (se magari hai una soluzione diversa l'accetto molto volentieri:

Codice:
......
$oggetto = $_POST['oggetto'];
$oggetto = "=?UTF-8?B?".base64_encode($oggetto)."?=";
.....
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
cosi non funzionava ?
PHP:
$messaggio = utf8_decode($_POST['messaggio']);
$oggetto = utf8_decode($_POST['oggetto']);
 

Francesco_72

Nuovo Utente
27 Mag 2016
28
2
3
49
cosi non funzionava ?
PHP:
$messaggio = utf8_decode($_POST['messaggio']);
$oggetto = utf8_decode($_POST['oggetto']);

Porc... avevo provato e mi aveva dato, nel messaggio, al posto della lettera accentata il simbolo del rombo con il punto interrogativo... ora ho riprovato e invece funziona benissimo... mah...

Cmq grazie mille dell'aiuto.
 
  • Like
Reactions: criric

websilvia

Nuovo Utente
18 Giu 2007
5
1
3
Roma
cosi non funzionava ?
PHP:
$messaggio = utf8_decode($_POST['messaggio']);
$oggetto = utf8_decode($_POST['oggetto']);

PERFETTO!! Grazie mille. In pratica ho usato la tua seconda opzione ed ha funzionato benissimo. L'unico problema riguardava eventuali accenti nell'oggetto. Usando la stessa procedura l'oggetto usciva bene ma il testo del messaggio di nuovo in modo sbagliato. Ho risolto mettendo quest'altro codice all'oggetto (se magari hai una soluzione diversa l'accetto molto volentieri:

Codice:
......
$oggetto = $_POST['oggetto'];
$oggetto = "=?UTF-8?B?".base64_encode($oggetto)."?=";
.....
 

websilvia

Nuovo Utente
18 Giu 2007
5
1
3
Roma
$messaggio = utf8_decode($_POST['messaggio']);

l'ho inserito così e funziona, graaandddiiii

Codice:
// MESSAGE
if (empty($_POST["message"])) {
    $errorMSG .= "Message is required ";
} else {
    $message = utf8_decode($_POST['message']);
}
grazie con questo funziona, grazzzissssime;):)
 
Stato
Chiusa ad ulteriori risposte.
Discussioni simili
Autore Titolo Forum Risposte Data
L [PHP] comando curl ad una pagin web PHP 1
C [PHP] Esecuzione comando contenuto in stringa PHP 2
G [PHP] composer: forzare l'uso del comando require-dev PHP 0
L [PHP] problema parsing con comando file get contents PHP 7
I comando php con "argomento" PHP 6
M esecuzione comando shell da applicazione php su client PHP 5
M eseguire un comando da php PHP 2
F comando php per caricare delle scritte in una pagina html PHP 4
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Array associativi php su 2 campi mysql PHP 10
G Invio form con PHP PHP 3
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 1
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1
L Estrazione dati php Database 6
A Aiuto per pagina php PHP 0
E Php select option e ajax PHP 23
I Aiuto php Dependent Lookup PHP 0
T arretramento versione PHP... PHP 3
D problema php mysql PHP 1

Discussioni simili