У меня возникла проблема с отправкой писем с арабским контентом с использованием почтовой функции 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?