[PHP] Comando mail() e lettere accentate

Stato
Chiusa ad ulteriori risposte.

Francesco_72

Nuovo Utente
27 Mag 2016
28
2
3
52
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
 
Ciao, hai provato con utf8_decode() ?
Codice:
$msg .= utf8_decode($messaggio) . "\n\n";
 
devi metterlo sulla variabile $messaggio non sulla variabile $msg snno codifichi anche l'allegato
 
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))
 
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
 
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)."?=";
.....
 
cosi non funzionava ?
PHP:
$messaggio = utf8_decode($_POST['messaggio']);
$oggetto = utf8_decode($_POST['oggetto']);
 
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
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)."?=";
.....
 
$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