2012-05-01 8 views
1

J'ai un problème avec l'envoi de mails qui conservent les caractères accentués. En lisant quelques pages et les réponses aux questions posées précédemment, j'ai pu trouver une solution qui fonctionne (partiellement).PHP Mail, setlocale et les caractères accentués

Je n'ai aucun problème avec le code suivant, qui fonctionne correctement (c'est-à-dire que je vois des caractères accentués dans le client e-mail que j'utilise). Il utilise la bibliothèque php PEAR. Cependant, ce code n'est bon que pour l'anglais, comme je l'expliquerai plus tard.

... 
$headers['From'] = "[email protected]"; 
$headers['Subject'] = 'Request'; 
$headers['Reply-To'] = $sanitized_email; 
$headers["Content-Type"] = 'text/html; charset=UTF-8'; 
$headers["Content-Transfer-Encoding"]= "8bit"; 

$host= _CMS_MAIL_SERVER; 
$username = "[email protected]"; 
$password = "pass"; 

$crlf = "\n"; 
$mime = new Mail_mime(array('eol' => $crlf)); 

$html_body = ...; 
// read $html_body from file 
// substitute some %tags% in $html_body 
$mime->setHTMLBody($html_body); 

$mimeparams['text_encoding']="8bit"; 
$mimeparams['text_charset']="UTF-8"; 
$mimeparams['html_charset']="UTF-8"; 
$mimeparams['head_charset']="UTF-8"; 

$mimebody = $mime->get($mimeparams); 
$hdrs = $mime->headers($headers); 

$smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' =>  $username, 'password' => $password)); 

$mail_res = $smtp->send($recipients, $hdrs, $mimebody); 
... 

Dans le html_body de $ J'ai quelques balises que je dois remplacer les valeurs heure et la date, retourné par date ou strftime (..). Comme les paramètres régionaux par défaut sont l'anglais, pour avoir des dates et des heures en italien, je dois définir les paramètres régionaux avant d'appeler strftime (...).

Si j'ajoute cette ligne:

setlocale(LC_TIME, "it_IT"); 

caractères accentués ne sont pas affichés correctement par le client de messagerie. Plus en détails: les caractères accentués retournés par strftime sont affichés correctement (par exemple, lunedì), tandis que les caractères accentués soumis via le champ de formulaire ne le sont pas.

J'ai fait quelques recherches pour comprendre comment je peux corriger cette erreur, mais je n'ai trouvé aucune solution. De plus, je ne vois pas très bien quelle est la relation entre setlocale sur LC_TIME et les caractères accentués.

Y a-t-il quelqu'un qui peut m'aider?

Répondre

0

J'ai résolu le problème. Setlocale (...) commute le codage des caractères même si ce n'est pas nécessaire. Dans ce cas, setlocale (LC_TIME, "it_IT") passait de UTF-8 à ISO-8859-1 et la page de réception utilisait UTF-8.

Lors de l'utilisation UTF-8 dans le bon sens pour régler locale est: setlocale (LC_TIME "it_IT.UTF-8").

Il était évident que le problème était lié aux encodages de caractères, mais setlocale ne devrait pas changer de paramètres régionaux si le codage utilisé est correct pour la langue (ou devrait-il?).

Questions connexes