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.