Кодировка электронной почты PHP?


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

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

Существуют ли какие-либо другие возможные причины?

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

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

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

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

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

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

Author: JasonS, 2010-02-15

7 answers

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

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

 29
Author: Belrog, 2010-02-15 11:42:05

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

$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));
 22
Author: Gumbo, 2010-02-15 11:42:26

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

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

 7
Author: Yanni, 2013-02-09 15:02:42

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

'Content-Type: text/plain;charset=utf-8'
 6
Author: teemoo, 2013-02-08 13:45:42

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

  $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(...)
 4
Author: Atara, 2010-02-15 11:49:35

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

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

 2
Author: Piskvor, 2010-02-15 11:45:51

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

$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);
 1
Author: isboleas, 2014-05-06 16:48:55