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.