Problemas de codificação de caracteres do PHPMailer


188

Eu tento usar o PHPMailer para enviar registro, ativação. etc mail para usuários:

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;  
}

O $messagecontém caracteres latinos. Infelizmente, todo o webmail (gmail, webmail.mydomain.org, emailaddress.domain.xx) está usando uma codificação diferente.

Como forçar o uso da codificação UTF-8 para mostrar minhas mensagens exatamente da mesma forma em todas as caixas de correio?

Tentei converter a largura do cabeçalho do correio mb_convert_encoding(), mas sem sorte.


A capitalização do CharSet acima foi alterada pela bovender.
Gogowitsch 22/03

Respostas:


472

Se você tem 100% de certeza de que a mensagem $ contém ISO-8859-1, pode usar utf8_encode, como diz David. Caso contrário, use mb_detect_encoding e mb_convert_encoding em $ message.

Observe também que

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

Deve ser substituído por:

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

E colocado após a instanciação da classe (após a new). As propriedades diferenciam maiúsculas de minúsculas! Veja o documento do PHPMailer na lista e na ortografia exata.

Além disso, a codificação padrão do PHPMailer é a 8bitque pode ser problemática com os dados UTF-8. Para corrigir isso, você pode fazer:

$mail->Encoding = 'base64';

Observe que 'quoted-printable'provavelmente também funcionaria nesses casos (e talvez até 'binary'). Para mais detalhes, você pode ler RFC1341 - Campo de cabeçalho de codificação de transferência de conteúdo .


35
Bem, eu não sei se cuidados ninguém como isso é loucura de idade, mas, eu tive que adicionar $ mail-> Encoding = "base64" para chegar a este trabalho para mim
Andrew Revak

5
@AndrewRevak Você salvou o dia! :)
carla

3
@AndrewRevak Great stuff! Foi isso que resolveu.
precisa

O uso de mb_detect_encoding e mb_convert_encoding teria sido bom.
BluE 07/01

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

A linha $mail -> CharSet = "UTF-8";deve ser posterior $mail = new PHPMailer();e sem espaços!

tente isso

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

5
Atualizei este post para uma melhor leitura, mas a pergunta do op já foi respondida 2 anos antes! E essa resposta aceita já incluía essa.
Dwza

5

Desculpe por estar atrasado na festa. Dependendo da configuração do servidor, pode ser necessário especificar caracteres estritamente com letras minúsculas utf-8; caso contrário, será ignorado. Tente fazer isso se você acabar aqui procurando soluções e nenhuma das respostas acima ajudar:

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

deve ser substituído por:

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


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

3

Eu estava recebendo o & oacute; em $ mail-> Assunto / w PHPMailer.

Então, para mim, a solução completa é:

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

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

Espero que ajude.


1

Quando uma das opções acima não funciona, e os e-mails ainda se parecem com ª הודפסה ×•× ×©×œ:

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

0

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

--- esta linha deve estar em

$mail = new PHPMailer(); line.

pff ..


Sim, está correto. Você deve colocá-lo após a instanciação do objeto.


Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem - você sempre pode comentar em suas próprias postagens e, quando tiver reputação suficiente , poderá comentar em qualquer post .
piet.t

Não é uma solicitação de crítica ou esclarecimento para esse problema. A resposta correta é: $ mail = new PHPMailer (); $ mail-> CharSet = 'UTF-8';
Nikos Kapetanakos

Zo me parece um comentário sobre a resposta de Holian, uma vez que não acrescenta nada a ela.
piet.t

se você usar a propriedade charSet não funcionará. O correto é CharSet. O caso faz o diferente.
Nikos Kapetanakos

Bem, então por que você cita a resposta errada em vez de dar a resposta correta? Mas essa já está lá também, então o que você precisa adicionar?
piet.t

0

A maneira mais simples e de ajudá-lo é definir CharSet como UTF-8

$mail->CharSet = "UTF-8"

@NickZuber A linha exata está lá devido a edições. Não foi tão exata na pergunta original ...
Sr. Tsjolder

0

Para evitar problemas de codificação de caracteres no envio de emails usando a classe PHPMailer, podemos configurá-lo para enviá-lo com codificação de caracteres UTF-8 usando o parâmetro "CharSet", como podemos ver no seguinte código Php:

$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();

-5

$ mail -> charSet = "UTF-8"; --- esta linha deve estar em $ mail = new PHPMailer (); linha.

pff ..

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.