Как я могу отправлять электронные письма с арабским контентом через функцию почты PHP? - PullRequest
4 голосов
/ 25 февраля 2010

У меня проблема с отправкой электронных писем с арабским контентом с помощью почтовой функции 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);
}

Есть предложения по альтернативным способам достижения этой цели?

Ответы [ 4 ]

6 голосов
/ 25 февраля 2010

К сожалению, кодировка 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, вероятно, будет лучшим выбором.)

0 голосов
/ 25 февраля 2010

Ваш код работает для меня как есть.

Вы уверены, что $message содержит правильную строку UTF-8?

0 голосов
/ 25 февраля 2010

Попробуйте это

$headers .= 'From: =?UTF-8?B?'.base64_encode($from). "\r\n";
0 голосов
/ 25 февраля 2010
        $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);

Этот работает для меня.

...