[PHP] Comando mail() e lettere accentate

Stato
Chiusa ad ulteriori risposte.

Francesco_72

Nuovo Utente
27 Mag 2016
28
2
3
51
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
51
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
51
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
51
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
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
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

Discussioni simili