Как я могу отправить письмо с кодировкой UTF-8? - PullRequest
2 голосов
/ 10 августа 2011

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

Правильно ли я все, что мне нужно сделать, это изменить часть кодировки на utf-8, или нужно что-то еще изменить, как 7-битную часть?

вы можете видеть, где я вставил один UTF-8 ссылка (еще не проверено)

здесь было что-то http://bitprison.net/php_mail_utf-8_subject_and_message, что, кажется, ссылается на базовое кодирование, но я не уверен, нужно ли мне это здесь?

// Contruct message body.
$body = "";

// Add message for non-mime clients.
$body .= "This is a multi-part message in MIME format.\n";

// Add text body.
$body .= "\n--$boundary\nContent-Type: text/plain; charset=UTF-8; format=flowed\nContent-Transfer-Encoding: 7bit\n\n" . $textContent;

// Add HTML body.
$body .= "\n--$boundary\nContent-Type: text/html; charset=ISO-8859-1; format=flowed\nContent-Transfer-Encoding: 7bit\n\n" . $htmlContent;

mail( $row["email"], "Update Your ArtsDB Listing", $body, $headers );

Я искал другой пост здесь для примера.

$body .= "\n--$boundary\nContent-Type: text/plain; charset=UTF-8; format=flowed\nContent-Transfer-Encoding: 8bit\n\n" . $textContent;

// Add HTML body.
$body .= "\n--$boundary\nContent-Type: text/html; charset=UTF-8; format=flowed\nContent-Transfer-Encoding: 8bit\n\n" . $htmlContent;

Ответы [ 2 ]

6 голосов
/ 10 августа 2011

Вы используете Content-Type: text/plain; charset=UTF-8, чтобы сообщить читателю, что в такой части сообщения используется UTF-8, что нормально, но ... Что содержит переменная $textContent? Это важный бит. Согласно Content-Transfer-Encoding: 7bit, это 7-битная кодировка, поэтому она не может быть сырой UTF-8. Однако вы не используете обычные 7-битные кодировки, используемые для электронной почты. В противном случае был бы (например) Content-Transfer-Encoding: quoted-printable заголовок.

Для подведения итогов необходимо:

  1. Иметь исходную строку, которая содержит действительный UTF-8.
  2. Выберите кодировку для передачи, такую ​​как quoted_printable_encode () .
  3. Добавьте заголовок, чтобы указать, какую кодировку передачи вы выбрали.

Вы также можете отправить необработанный UTF-8 как есть и установить Content-Transfer-Encoding: 8bit, но я бы не рекомендовал его. Вы рискуете нарушить стандарт SMTP, просто отправляя очень длинные строки. Кроме того, вы не представляете, какие унаследованные программы будут проходить.

Электронная почта труднее, чем кажется, поэтому рано или поздно вы используете стороннюю библиотеку: PHP Mailer , Swift Mailer , PEAR Mail ...

1 голос
/ 10 августа 2011

Content-Transfer-Encoding: 7bit

Это не имеет смысла - прямого преобразования между 7-битными данными и 8-битным представлением нет.Вам нужно изменить заголовки MIME, чтобы указать, какую кодировку вы используете.

Для SMTP кодировка передачи должна быть 7-битной кодировкой ascii.Чтобы изменить ваши данные utf8, вам нужно это кодировать - обычные кодировки - base64 и для печати в кавычках (PHP обеспечивает кодирование и декодирование fns для обоих).

Почему бы просто не использовать хорошую библиотеку, такую ​​как phpmailer или swiftmailer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...