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

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.

Ion
fuente
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 .

AlexV
fuente
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";
usuario2354947
fuente
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";
vzr
fuente
5

Yo trabajo de esta manera

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

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

yorkfx
fuente
No tengo nada POST, solo una cadena francesa normal escrita en un archivo codificado utf-8, y esto funcionó de maravilla, ¡gracias!
toni07
3
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";
Ali Ebrahimi
fuente
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.

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

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

$ mail -> charSet = "UTF-8"; --- esta línea debe estar debajo de $ mail = new PHPMailer (); línea.

pff ..


fuente