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     = "[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;  
}

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.

Íon
fonte
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 .

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

Eu me trabalho assim

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

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

yorkfx
fonte
Eu não tenho nada do POST, apenas uma string francesa comum escrita em um arquivo codificado utf-8, e isso funcionou como um encanto, obrigado!
Toni07 23/05
3
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";
ali ebrahimi
fonte
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.

biojazzard
fonte
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) . '?=';;
Ohad Cohen
fonte
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.

Nikos Kapetanakos
fonte
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"
Trung Bui
fonte
@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 = '[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
fonte
-5

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

pff ..


fonte