Problèmes d'encodage de caractères PHPMailer


199

J'essaye d'utiliser PHPMailer pour envoyer l'inscription, l'activation. etc mail 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;  
}

Le $messagecontient des caractères latins. Malheureusement, tout le webmail (gmail, webmail.mydomain.org, emailaddress.domain.xx) utilise un codage différent.

Comment puis-je forcer l'utilisation du codage UTF-8 pour afficher mon courrier 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 chance.


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

Réponses:


501

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 le new). Les propriétés sont sensibles à la casse! Voir la documentation PHPMailer pour la liste et l'orthographe exacte.

Le codage par défaut de PHPMailer 8bitpeut également être problématique avec les données UTF-8. Pour résoudre ce problème, vous pouvez faire:

$mail->Encoding = 'base64';

Prenez note que 'quoted-printable'cela fonctionnerait probablement aussi dans ces cas (et peut-être même 'binary'). Pour plus de détails, vous pouvez lire RFC1341 - Content-Transfer-Encoding Header Field .


36
Eh bien, je ne sais pas si quelqu'un s'en soucie car c'est fou mais, j'ai dû ajouter $ mail-> Encoding = "base64" pour que cela fonctionne pour moi
— Andrew Revak

5
@AndrewRevak Vous avez sauvé la mise! :)
— carla

3
@AndrewRevak Super choses! C'est ce qui l'a résolu.
— BernardA

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

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

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

essaye ça

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

5
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 était déjà incluse dans celle-ci.
— Dwza

6

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

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

doit être remplacé par:

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


3

Je devenais & eacute; dans $ mail-> Subject / w PHPMailer.

Donc pour moi, la solution complète est:

// Your Subject with tildes. Example.
$someSubjectWithTildes = 'Subscripción España';

$mailer->CharSet = 'UTF-8';
$mailer->Encoding = 'quoted-printable';
$mailer->Subject = html_entity_decode($someSubjectWithTildes);

J'espère que cela aide.


2
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";

Il n'y a pas d'encodage tel que16bit
— Synchro

0

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

--- cette ligne doit être sous

$mail = new PHPMailer(); line.

pff ..


Oui c'est correct. Vous devez le placer après l'instanciation de l'objet.


Cela ne répond pas à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son message - vous pouvez toujours commenter vos propres articles, et une fois que vous avez une réputation suffisante, vous pourrez commenter n'importe quel article .
— piet.t

Ce n'est pas une critique ou une demande de clarification pour cette question. La bonne réponse est: $ mail = new PHPMailer (); $ mail-> CharSet = 'UTF-8';
— Nikos Kapetanakos

Zo-moi, cela ressemble à un commentaire sur la réponse de Holian car il n'y ajoute rien.
— piet.t

si vous utilisez la propriété charSet ne fonctionnera pas. Le bon est CharSet. L'affaire fait la différence.
— Nikos Kapetanakos du

Eh bien, alors pourquoi citez-vous la mauvaise réponse au lieu de donner la bonne? Mais celui-là existe déjà aussi, alors qu'avez-vous à ajouter?
— piet.t

0

Le moyen le plus simple et vous aidera est de définir CharSet sur UTF-8

$mail->CharSet = "UTF-8"

@NickZuber La ligne exacte est là en raison de modifications. Ce n'était pas si exact dans la question initiale ...
— M. Tsjolder

0

Pour éviter les problèmes d'encodage de caractères lors de l'envoi d'e-mails en utilisant la classe PHPMailer, nous pouvons le configurer pour l'envoyer avec l'encodage de caractères UTF-8 en utilisant le paramètre "CharSet", comme on peut le voir dans le code Php suivant:

$mail = new PHPMailer();
$mail->From = 'midireccion@email.com';
$mail->FromName = 'Mi nombre';
$mail->AddAddress('emaildestino@email.com');
$mail->Subject = 'Prueba';
$mail->Body = '';
$mail->IsHTML(true);


// Active condition utf-8
$mail->CharSet = 'UTF-8';


// Send mail
$mail->Send();

0

Lorsque aucun des éléments ci-dessus ne fonctionne, et que les mails ressemblent toujours à ª הודפסה ×•× ×©×œ:

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

-5

$ mail -> charSet = "UTF-8"; --- cette ligne doit être sous $ mail = new PHPMailer (); ligne.

pff ..

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.