Как отправлять электронные письма с содержанием на арабском языке через почтовую функцию PHP?
Вопрос
У меня возникла проблема с отправкой электронных писем с содержимым на арабском языке с помощью почтовой функции PHP.Допустим, у меня есть простая арабская строка:
بريد
Я пробовал несколько способов использования заголовков, но содержимое всех писем по-прежнему выглядит примерно так: X*X1X(X1Y X/
.Однако тема электронного письма правильно закодирована, если я использую арабские символы (спасибо base64_encode, см. функцию ниже).
Вот одна из функций электронной почты, которую я пробовал
function sendSimpleMail($to,$from,$subject,$message) {
$headers = 'MIME-Version: 1.0' ."\r\n";
$headers .= 'To: '.$to ."\r\n";
$headers .= 'From: '.$from . "\r\n";
$headers .= 'Content-type: text/plain; charset=UTF-8; format=flowed' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 8bit'."\r\n";
mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=',$message, $headers);
}
Любые предложения по альтернативным способам достижения этой цели?
Решение
К сожалению, 8bit
кодировка в электронной почте ненадежна.Многие агенты транспорта почты удаляют верхний бит каждого байта в теле письма. بريد
является "\xD8\xA8\xD8\xB1\xD9\x8A\xD8\xAF"
в байтах UTF-8;удалите верхний бит из этих байтов, и вы получите ASCII "X(X1Y\nX/"
.
Способ добавления символов, отличных от ASCII, в тело письма состоит в том, чтобы установить Content-Transfer-Encoding
либо base64
или quoted-printable
, и закодируйте тело с помощью base64_encode
или quoted_printable_encode
, соответственно.
(quoted-printable
лучше, если почта будет в основном в формате ASCII, поскольку она сохраняет читаемость в закодированной форме и более эффективна для ASCII.Если вся почта на арабском языке, base64
наверное, это лучший выбор.)
Другие советы
$boundary = uniqid(rand(), true);
$headers = "From: $from\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary = $boundary\n";
$headers .= "This is a MIME encoded message.\n\n";
$headers .= "--$boundary\n" .
"Content-Type: text/plain; charset=UTF-8 \n" .
"Content-Transfer-Encoding: base64\n\n";
$headers .= chunk_split(base64_encode($plaintext));
$headers .= "--$boundary\n" .
"Content-Type: text/html; charset=ISO-8859-1\n" .
"Content-Transfer-Encoding: base64\n\n";
$headers .= chunk_split(base64_encode($msg));
$headers .= "--$boundary--\n" .
mail($address, $subject, '', $headers);
Этот работает для меня.
Попробуй это
$headers .= 'From: =?UTF-8?B?'.base64_encode($from). "\r\n";
У меня ваш код работает как есть.
Ты уверен, что $message
содержит действительную строку UTF-8?