2010-02-15 5 views
25

У меня возникли проблемы с иностранными символами при отправке электронной почты. Может кто-нибудь посоветует мне, что делать. Я думаю, что проблема может быть одной из трех.PHP E-Mail Encoding?

1) Неверная кодировка html-страницы. (Будет ли это влиять на данные POST из формы?) 2) Функция почты не имеет никакой кодировки. Таким образом, программа не знает, как ее читать. (Скорее всего) 3) Сам файл не имеет правильной кодировки и, следовательно, создает проблемы. (Вероятно, маловероятно)

Есть ли другие возможные причины?

Я пытаюсь сбить их с 1 по 1, пока не найду проблему. Я думаю, что вариант 2 является наиболее вероятной причиной. Как добавить правильную универсальную кодировку в почтовую функцию?

Это то, что у меня есть на данный момент.

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

В настоящее время я знаю, что форма не отправляет польских или шведских символов.

Я был бы очень признателен, если бы кто-нибудь мог указать на любые другие возможные причины и сказать мне, какую кодировку мне нужно использовать для отправки электронной почты.

Большое спасибо.

ответ

28

Насколько я знаю, PHP не поддерживает UTF-8 в качестве кодировки по умолчанию для своих строк. Вам необходимо использовать соответствующие функции кодирования/обработки для кодирования, которые вы предпочитаете.

Также добавьте в заголовки электронной почты «Content-Type: text/html; charset = utf-8», чтобы почтовые клиенты правильно отображали символы (или заменяли ваш выбор кодировки).

+9

для сообщений электронной почты на основе текста (не в HTML) используйте: 'Content-Type: Текст/равнинный, кодировка = UTF-8' –

+0

Можете ли вы разместить код? – 2014-01-12 16:24:20

20

Вы не указали тип и кодировку вашего контента. Попробуйте следующее:

$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

Используйте почтовую оболочку PHP, это спасет ваше здравомыслие (исходя из опыта здесь). Например, PHPMailer позволяет вам устанавливать исходящую кодировку электронной почты и создает для вас сообщение.

Также используйте UTF-8; это почти повсеместно поддерживается в наши дни и охватывает все персонажи, которые вам когда-либо понадобятся.

4

Я использую следующий код:

$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

есть конкретная причина, по которой вы используете \ n \ r \ n вместо \ r \ n позади "Content-Transfer-Encoding: 8bit"? – Lexib0y

+0

, вероятно, просто скопирован из файла образца, и он сработал :) – Atara

6

В дополнение к тому, что было сказано ранее, это не является обязательным для отправки почты в формате HTML, чтобы иметь возможность использовать UTF-8, вы можете отформатировать его как простой текст в заголовках:

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

Используйте этот код

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

от: http://php.net/manual/en/function.mail.php

+1

Не могли бы вы рассказать мне, почему вы используете кодировку передачи 7 бит, поскольку я часто вижу 8 бит? – Lexib0y

+0

Из того, что я нашел, 7bit является по умолчанию для электронной почты, так как некоторые действительно старые почтовые клиенты и серверы не могут иметь дело с 8 бит. Отправка 7-битного кавычки-печати просто безопасна. Тем не менее, вы, возможно, можете отправить 8 бит iso-8859-1 или 8bit utf-8 без проблем. – Adrian

+0

+1 к базе64_encode() по теме. Никогда об этом не думал. благодаря – Alexandre

1

Я использую этот код для решения проблемы с греческим кодированием в старой почте Орды.

$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);