PHP кодирование электронной почты? - PullRequest
29 голосов
/ 15 февраля 2010

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

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

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

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

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

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

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

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

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

Ответы [ 7 ]

29 голосов
/ 15 февраля 2010

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

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

22 голосов
/ 15 февраля 2010

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

$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));
10 голосов
/ 09 февраля 2013

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

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

8 голосов
/ 08 февраля 2013

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

'Content-Type: text/plain;charset=utf-8'
4 голосов
/ 15 февраля 2010

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

  $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(...)
2 голосов
/ 15 февраля 2010

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

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

1 голос
/ 06 мая 2014

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

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...