¿Cómo enviar un correo electrónico UTF-8?


82

Cuando envío el correo electrónico, el correo electrónico no muestra caracteres que no sean el inglés. Se muestra como a continuación:

ä½ ™ ç ”Ÿä» ä »

¿Puede saber realmente qué causa esto? Incluso intenté agregar Content-type y charset en el script, todavía muestra lo mismo.

solía Mail::Factory("mail");


2
¿Que usas? nativo mail()o Zend_Mailo PHPMailer? ¡Necesito código del método Factory!
Wesley van Opdorp

2
Además, debe ocuparse de los clientes de correo electrónico de destino. Incluso si logra ver el correo electrónico correctamente en su cliente de correo electrónico no significa que su cliente verá el correo correcto. Al final, siempre construyo correos electrónicos html con encabezado de juego de caracteres utf-8. De esta forma, la mayoría de los clientes de correo electrónico muestran el contenido correctamente.
Marco

@FlyBy: sí, eso es exactamente lo que quiero hacer, mostrar el contenido con el juego de caracteres utf-8, pero todavía no puedo ver el correo electrónico correctamente.
deepWebMie

El tipo de contenido y el conjunto de caracteres son precisamente lo que necesita para que esto funcione, pero debe proporcionarnos más información. ¿Puedes mostrarnos el código? y / o la fuente del mensaje resultante? ¿Está seguro de que sus datos están codificados correctamente en utf8?
tripleee

3
aquí está mi código de ejemplo: $mail = Mail::factory("mail"); $to = "me@abc.com"; $body = "好信"; $headers = array("Content-type =>"text/plain: charset=\"UTF-8","From" => "abc@abc.com","To" => "me@abc.com","Subject" => "Test Send Chinese mail-好信"); $mail->send($to, $headers, $body); ¿Es correcto? No muestra lo que espero. Debe mostrar la palabra china en el cuerpo, el encabezado o incluso en el asunto.
deepWebMie

Respuestas:


116

Puede agregar el encabezado "Content-Type: text / html; charset = UTF-8" al cuerpo de su mensaje.

$headers = "Content-Type: text/html; charset=UTF-8";

Si usa la mail()función nativa , $ headers array será el cuarto parámetro mail($to, $subject, $message, $headers)

Si usa PEAR Mail :: factory (), el código será:

$smtp = Mail::factory('smtp', $params);

$mail = $smtp->send($to, $headers, $body);

aquí está mi código $ mail = Mail :: factory ("mail"); $ to = "me@abc.com"; $ cuerpo = "好 信"; $ headers = array ("Content-type =>" text / plain: charset = \ "UTF-8", "From" => "abc@abc.com", "To" => "me@abc.com" , "Asunto" => "Prueba Enviar correo chino- 好 信"); $ mail-> send ($ to, $ headers, $ body) ¿Es correcto? No muestra lo que espero. Debe mostrar la palabra china en el cuerpo, el encabezado o incluso en el asunto.
deepWebMie

1
¿Qué herramientas de correo electrónico siguen utilizando la codificación de transferencia de 7 bits?
Grodriguez

3
¡El cuarto parámetro de php mail()es una cadena, no una matriz!
Vladimir Panteleev

2
¡Asegúrate de escribir charset=UTF-8sin comillas UTF-8!
Mel_T

4
Úselo únicamente text/htmlsi envía un correo electrónico en formato HTML. Para correos electrónicos de texto sin formato, lo desea text/plain.
Stewart

34

Estoy usando un juego de caracteres bastante especificado (ISO-8859-2) porque no todos los sistemas de correo (por ejemplo: http://10minutemail.com ) pueden leer correos UTF-8. Si necesita esto:

function utf8_to_latin2($str)
{
    return iconv ( 'utf-8', 'ISO-8859-2' , $str );
}
function my_mail($to,$s,$text,$form, $reply)
    {
        mail($to,utf8_to_latin2($s),utf8_to_latin2($text),
        "From: $form\r\n".
        "Reply-To: $reply\r\n".
        "X-Mailer: PHP/" . phpversion());
    }

He hecho otra función de mailer, porque el dispositivo Apple no podía leer bien la versión anterior.

function utf8mail($to,$s,$body,$from_name="x",$from_a = "info@x.com", $reply="info@x.com")
{
    $s= "=?utf-8?b?".base64_encode($s)."?=";
    $headers = "MIME-Version: 1.0\r\n";
    $headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";
    $headers.= "Content-Type: text/plain;charset=utf-8\r\n";
    $headers.= "Reply-To: $reply\r\n";  
    $headers.= "X-Mailer: PHP/" . phpversion();
    mail($to, $s, $body, $headers);
}

2
¿Y qué sucede si está intentando enviar contenido que no se puede representar en ISO-8859-2?
diciembre

4
$headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";esta línea resolvió mi problema, gracias!
Julia

1
Considere la codificación imprimible entre comillas para facilitar la lectura en correos de texto sin formato, es tan simple:'=?utf-8?Q?' . quoted_printable_encode($string) . '?='
Citando a Eddie

@Julia Gracias, mi también.
fdrv

¿qué pasa con cc y bcc?
Toskan

1

Si no es así HTML, entonces UTF-8no es recomendable. koi8-ry windows-1251solo sin problemas. Así que usa el correo html.

$headers['Content-Type']='text/html; charset=UTF-8';
$body='<html><head><meta charset="UTF-8"><title>ESP Notufy - ESP Сообщения</title></head><body>'.$text.'</body></html>';


$mail_object=& Mail::factory('smtp',
    array ('host' => $host,
        'auth' => true,
        'username' => $username,
        'password' => $password));
$mail_object->send($recipents, $headers, $body);
}
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.