267 votes

Problèmes de codage des caractères de PHPMailer

J'essaie d'utiliser PHPMailer pour envoyer des messages d'enregistrement, d'activation, etc. aux utilisateurs :

require("class.phpmailer.php");
$mail -> charSet = "UTF-8";
$mail = new PHPMailer();
$mail->IsSMTP();  
$mail->Host     = "smtp.mydomain.org";  
$mail->From     = "name@mydomain.org";
$mail->SMTPAuth = true; 
$mail->Username ="username"; 
$mail->Password="passw"; 
//$mail->FromName = $header;
$mail->FromName = mb_convert_encoding($header, "UTF-8", "auto");
$mail->AddAddress($emladd);
$mail->AddAddress("mytest@gmail.com");
$mail->AddBCC('mytest2@mydomain.org', 'firstadd');
$mail->Subject  = $sub;
$mail->Body = $message;
$mail->WordWrap = 50;  
if(!$mail->Send()) {  
   echo 'Message was not sent.';  
   echo 'Mailer error: ' . $mail->ErrorInfo;  
}

The $message contient des caractères latins. Malheureusement, tous les webmails (gmail, webmail.mydomain.org, emailaddress.domain.xx) utilisent un codage différent.

Comment puis-je forcer l'utilisation du codage UTF-8 pour que mon courrier s'affiche exactement de la même manière sur toutes les boîtes aux lettres ?

J'ai essayé de convertir la largeur de l'en-tête du courrier mb_convert_encoding() mais sans succès.

0 votes

La capitalisation de CharSet ci-dessus a été modifiée par bovender.

632voto

AlexV Points 8604

Si vous êtes sûr à 100% que $message contient ISO-8859-1 vous pouvez utiliser utf8_encode comme le dit David. Sinon, utilisez mb_detect_encoding et mb_convert_encoding sur $message.

Notez également que

$mail -> charSet = "UTF-8"; 

Doit être remplacé par :

$mail->CharSet = 'UTF-8';

Et placé après l'instanciation de la classe (après l'élément new ). Les propriétés sont sensibles à la casse ! Voir le PHPMailer doc pour la liste et l'orthographe exacte.

L'encodage par défaut de PHPMailer est aussi 8bit ce qui peut être problématique avec les données UTF-8. Pour résoudre ce problème, vous pouvez faire ce qui suit

$mail->Encoding = 'base64';

Notez que 'quoted-printable' fonctionnerait probablement aussi dans ces cas (et peut-être même 'binary' ). Pour plus de détails, vous pouvez lire RFC1341 - Champ d'en-tête Content-Transfer-Encoding .

45 votes

Je ne sais pas si cela intéresse quelqu'un car c'est très vieux mais j'ai dû ajouter $mail->Encoding = "base64" pour que cela fonctionne pour moi.

0 votes

L'utilisation de mb_detect_encoding et mb_convert_encoding aurait été bien.

0 votes

Il est très étrange que cette seule déclaration soit la cause première du problème, le courrier n'étant pas envoyé (alors qu'il n'y avait aucune erreur). $message += '\n\nThis message was sent from IP Address: . Une fois que j'ai remplacé += par .=, les e-mails ont commencé à être envoyés.

37voto

user2354947 Points 41
$mail -> CharSet = "UTF-8";
$mail = new PHPMailer();

ligne $mail -> CharSet = "UTF-8"; doit être après $mail = new PHPMailer();

essayez ceci

$mail = new PHPMailer();
$mail->CharSet = "UTF-8";

6 votes

J'ai mis à jour ce post pour une meilleure lecture, mais la question de l'op a déjà été répondue 2 ans auparavant ! Et cette réponse acceptée incluait déjà celle-ci.

7voto

yorkfx Points 70

Je travaille moi-même de cette façon

  $mail->FromName = utf8_decode($_POST['name']);

http://php.net/manual/en/function.utf8-decode.php

6voto

vzr Points 95

Désolé d'être en retard sur la fête. Selon la configuration de votre serveur, il se peut que vous deviez spécifier le caractère strictement avec lettres minuscules utf-8, sinon il sera ignoré. Essayez ceci si vous vous retrouvez ici à chercher des solutions et qu'aucune des réponses ci-dessus ne vous aide :

$mail->CharSet = "UTF-8";

doit être remplacé par :

$mail->CharSet = "utf-8";

0 votes

Dans la norme, il est toujours en majuscules, si cela a de l'importance.

6voto

Ohad Cohen Points 384

Lorsque rien de ce qui précède ne fonctionne, et que les mails ressemblent toujours à ceci ª × :

$mail->addCustomHeader('Content-Type', 'text/plain;charset=utf-8');
$mail->Subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';;

0 votes

Celui-ci a fonctionné pour moi en utilisant l'iso-8859-1 dans le corps.

0 votes

Cela a fonctionné pour moi avec Apache, en encodant ISO-8859-1 sous Windows avec le client MS Outlook.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X