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     = "[email protected]";
$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("[email protected]");
$mail->AddBCC('[email protected]', '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.

Synchro
la source
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 .

AlexV
la source
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";
user2354947
la source
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";
vzr
la source
5

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

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

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

yorkfx
la source
Je n'ai rien de POST moi-même, juste une chaîne de caractères française ordinaire écrite dans un fichier encodé en utf-8, et cela a fonctionné comme un charme, merci!
toni07
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.

biojazzard
la source
2
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";
Ali Ebrahimi
la source
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.

Nikos Kapetanakos
la source
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"
Trung Bui
la source
@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 = '[email protected]';
$mail->FromName = 'Mi nombre';
$mail->AddAddress('[email protected]');
$mail->Subject = 'Prueba';
$mail->Body = '';
$mail->IsHTML(true);


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


// Send mail
$mail->Send();
Mohammed Alhfian
la source
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) . '?=';;
Ohad Cohen
la source
-5

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

pff ..


la source