Problemas de codificación de caracteres de PHPMailer


190

Intento usar PHPMailer para enviar el registro, la activación. etc correo a los usuarios:

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

El $messagecontiene caracteres latinos. Desafortunadamente, todo el correo web (gmail, webmail.mydomain.org, emailaddress.domain.xx) está usando una codificación diferente.

¿Cómo puedo forzar el uso de la codificación UTF-8 para mostrar mi correo exactamente igual en todos los buzones?

Traté de convertir el ancho del encabezado del correo mb_convert_encoding(), pero sin suerte.


La capitalización de CharSet anterior fue cambiada por bovender.
Gogowitsch

Respuestas:


476

Si está 100% seguro de que $ message contiene ISO-8859-1, puede usar utf8_encode como dice David. De lo contrario, use mb_detect_encoding y mb_convert_encoding en $ message.

También tenga en cuenta que

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

Debe ser reemplazado por:

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

Y se coloca después de la instanciación de la clase (después de new). ¡Las propiedades distinguen entre mayúsculas y minúsculas! Vea el documento PHPMailer para la lista y la ortografía exacta.

Además, la codificación predeterminada de PHPMailer 8bitpuede ser problemática con los datos UTF-8. Para arreglar esto puedes hacer:

$mail->Encoding = 'base64';

Tenga en cuenta que 'quoted-printable'probablemente también funcionaría en estos casos (y tal vez incluso 'binary'). Para obtener más detalles, puede leer RFC1341 - Campo de encabezado de codificación de transferencia de contenido .


35
Bueno, no sé si a alguien le importa, ya que es una locura, pero tuve que agregar $ mail-> Encoding = "base64" para que esto funcione para mí
Andrew Revak

55
@AndrewRevak ¡Has salvado el día! :)
carla

3
@AndrewRevak ¡Grandes cosas! Eso es lo que lo resolvió.
BernardA

El uso de mb_detect_encoding y mb_convert_encoding hubiera sido bueno.
BluE

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

¡La línea $mail -> CharSet = "UTF-8";debe ser después $mail = new PHPMailer();y sin espacios!

prueba esto

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

55
Actualicé esta publicación para una mejor lectura, ¡pero la pregunta del operador ya fue respondida 2 años antes! Y eso aceptó y ya estaba incluido.
Dwza

5

Perdón por llegar tarde a la fiesta. Dependiendo de la configuración de su servidor, es posible que deba especificar el carácter estrictamente con letras minúsculas utf-8; de lo contrario, se ignorará. Pruebe esto si termina aquí buscando soluciones y ninguna de las respuestas anteriores ayuda:

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

debe reemplazarse con:

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


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

3

Me estaba poniendo & oacute; en $ mail-> Asunto / w PHPMailer.

Entonces para mí la solución completa es:

// 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 eso ayude.


1

Cuando ninguno de los anteriores funciona, y todavía se ve el correo ª הודפסה ×•× ×©×œ:

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

0

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

--- esta línea debe estar debajo

$mail = new PHPMailer(); line.

pff ..


Si es correcto. Debe colocarlo después de la instanciación del objeto.


Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente reputación podrá comentar cualquier publicación .
piet.t

No es una solicitud de crítica o aclaración para este problema. La respuesta correcta es: $ mail = new PHPMailer (); $ mail-> CharSet = 'UTF-8';
Nikos Kapetanakos

Zo me parece un comentario sobre la respuesta de Holian ya que no le agrega nada.
piet.t

si usa la propiedad charSet no funcionará. El correcto es CharSet. El caso hace lo diferente.
Nikos Kapetanakos

Bueno, entonces ¿por qué cita la respuesta incorrecta en lugar de dar la correcta? Pero ese ya está allí también, entonces, ¿qué tienes que agregar?
piet.t

0

La forma más sencilla y con la que te ayudaremos es establecer CharSet en UTF-8

$mail->CharSet = "UTF-8"

@NickZuber La línea exacta está allí debido a las ediciones. No era tan exacto en la pregunta original ...
Sr. Tsjolder

0

Para evitar problemas de codificación de caracteres al enviar correos electrónicos utilizando la clase PHPMailer, podemos configurarlo para que lo envíe con codificación de caracteres UTF-8 utilizando el parámetro "CharSet", como podemos ver en el siguiente 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 línea debe estar debajo de $ mail = new PHPMailer (); línea.

pff ..

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.