2010-02-15 18 views
25

Tengo problemas con caracteres extranjeros al enviar un correo electrónico. ¿Alguien podría aconsejarme sobre qué hacer? Creo que el problema podría ser una de tres cosas.PHP E-Mail Encoding?

1) La codificación de la página html es incorrecta. (¿Esto afectaría los datos POST del formulario?) 2) La función de correo no tiene ninguna codificación. Por lo tanto, el programa no sabe cómo leerlo. (Más probable) 3) El archivo en sí no tiene la codificación correcta y por lo tanto está causando problemas. (Probablemente bastante improbable)

¿Hay alguna otra causa posible?

Estoy tratando de eliminar esto 1 por 1 hasta que encuentre el problema. Creo que la opción 2 es la causa más probable. ¿Cómo agrego la codificación universal adecuada a una función de correo?

Esto es lo que tengo en este momento.

$mail_sent = mail($client_email, $title, $message, "From: {$visitor_email}"); 

Actualmente, soy consciente de que el formulario no envía caracteres polacos o suecos.

Estaría muy agradecido si alguien pudiera señalar otras causas posibles y me diga qué codificación necesito para enviar correos electrónicos.

Muchas gracias.

Respuesta

28

Por lo que sé, PHP no admite UTF-8 como codificación predeterminada para sus cadenas. Necesita utilizar las funciones de codificación/manejo relevantes para la codificación que prefiera.

Agregue también un 'Tipo de contenido: texto/html; charset = utf-8' a sus encabezados de correo electrónico para que los clientes de correo electrónico muestren los caracteres correctamente (o reemplace con la codificación de su elección).

+9

mensajes de correo electrónico basados ​​en texto (no en html) utilizar: 'Content-Type: text/plain; charset = UTF-8' –

+0

Puede usted por favor enviar el código? –

20

No especificó el tipo y la codificación de su contenido. Pruebe esto:

$headerFields = array(
    "From: {$visitor_email}", 
    "MIME-Version: 1.0", 
    "Content-Type: text/html;charset=utf-8" 
); 
$mail_sent = mail($client_email, $title, $message, implode("\r\n", $headerFields)); 
2

Utilice un envoltorio de correo PHP, se guardará la cordura (hablando desde la experiencia aquí). Por ejemplo, PHPMailer le permite configurar la codificación del correo electrónico saliente y crea el mensaje por usted.

Además, use UTF-8; es casi universalmente compatible hoy en día y cubre todos los personajes que alguna vez necesitarías.

4

uso el siguiente código:

$text = ""; 
    $text .= "<html>\n"; 
    $text .= "<body style=\"font-family:Arial; \">\n"; 

    $text .= "<b>Add Your text here . . .</b>"; 
    $text .= date("d.m.Y") . " <br><br>\n\n"; 

    $text .= "</body>\n"; 
    $text .= "</html>\n"; 

$headers = 'From: ' . $myEmail . "\r\n"; 
$headers .= 'To: ' . $depEmail . "\r\n";  
$headers .= 'Return-Path: ' . $myEmail . "\r\n"; 
$headers .= 'MIME-Version: 1.0' ."\r\n"; 
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n"; 
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; 
$headers .= $text . "\r\n"; 

set_time_limit(30); 
if (!mail('', 'Demande information', '', $headers)) { 
    Alert(...) 
+1

¿hay alguna razón específica por la que usa \ n \ r \ n en lugar de \ r \ n detrás de "Content-Transfer-Encoding: 8bit"? – Lexib0y

+0

probablemente solo haya copiado de un archivo de muestra, y funcionó :) – Atara

6

Además de lo dicho anteriormente, no es obligatorio enviar el correo en HTML para poder utilizar UTF-8, también puede formatear como texto simple en los encabezados:

'Content-Type: text/plain;charset=utf-8' 
6

Usar este código

function mail_send($arr) 
{ 
    if (!isset($arr['to_email'], $arr['from_email'], $arr['subject'], $arr['message'])) { 
     throw new HelperException('mail(); not all parameters provided.'); 
    } 

    $to   = empty($arr['to_name']) ? $arr['to_email'] : '"' . mb_encode_mimeheader($arr['to_name']) . '" <' . $arr['to_email'] . '>'; 
    $from  = empty($arr['from_name']) ? $arr['from_email'] : '"' . mb_encode_mimeheader($arr['from_name']) . '" <' . $arr['from_email'] . '>'; 

    $headers = array 
    (
     'MIME-Version: 1.0', 
     'Content-Type: text/html; charset="UTF-8";', 
     'Content-Transfer-Encoding: 7bit', 
     'Date: ' . date('r', $_SERVER['REQUEST_TIME']), 
     'Message-ID: <' . $_SERVER['REQUEST_TIME'] . md5($_SERVER['REQUEST_TIME']) . '@' . $_SERVER['SERVER_NAME'] . '>', 
     'From: ' . $from, 
     'Reply-To: ' . $from, 
     'Return-Path: ' . $from, 
     'X-Mailer: PHP v' . phpversion(), 
     'X-Originating-IP: ' . $_SERVER['SERVER_ADDR'], 
    ); 

    mail($to, '=?UTF-8?B?' . base64_encode($arr['subject']) . '?=', $arr['message'], implode("\n", $headers)); 
} 

de: http://php.net/manual/en/function.mail.php

+1

¿Podría decirme por qué utiliza la codificación de transferencia de 7 bits, ya que a menudo veo 8 bits? – Lexib0y

+0

Por lo que he encontrado, 7bit es el valor predeterminado para el correo electrónico, ya que algunos clientes y servidores de correo realmente antiguos no pueden tratar con 8 bits. Enviar 7bit entre comillas imprimibles es ir a lo seguro. Dicho esto, probablemente puedas enviar 8bit iso-8859-1 u 8bit utf-8 sin ningún problema. – Adrian

+0

+1 a base64_encode() en el sujeto. Nunca pensé en eso antes. Gracias – Alexandre

1

Utilizo este código para resolver el problema con la codificación griega en el antiguo correo de la Horda.

$headers = 'From: ' . $youremail . "\r\n"; 
$headers .= 'To: ' . $to . "\r\n";  
$headers .= 'Return-Path: ' . $youremail . "\r\n"; 
$headers .= 'MIME-Version: 1.0' ."\r\n"; 
$headers .= 'Content-Type: text/HTML; charset=utf-8' . "\r\n"; 
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; 
$headers .= $message . "\r\n"; 

mail('', 'Request from Site yoursite', '', $headers);