Как отправлять электронные письма с содержанием на арабском языке через почтовую функцию PHP?

StackOverflow https://stackoverflow.com/questions/2334935

  •  22-09-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top