¿Cómo puedo enviar mensajes de correo electrónico con contenido en árabe a través de la función de correo de PHP?

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

  •  22-09-2019
  •  | 
  •  

Pregunta

Estoy teniendo un problema con el envío de mensajes de correo electrónico con contenido árabe usando la función de correo de PHP. Digamos que tengo esta cadena árabe simple:

بريد

He intentado varias formas de utilizar los encabezados, pero el contenido de mensajes de correo electrónico todos todavía terminan con algo como: X*X1X(X1Y X/. Sin embargo, el asunto del correo electrónico se codifica correctamente si uso caracteres arábigos (gracias a la base64_encode, véase la función más adelante)

Esta es una de las funciones de correo electrónico He intentado

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);
}

¿Alguna sugerencia sobre formas alternativas para lograr este objetivo?

¿Fue útil?

Solución

Por desgracia, 8bit codificación no es fiable en el correo electrónico. Muchos agentes de transporte de correo se eliminará el bit superior de cada byte en el cuerpo del correo. بريد es "\xD8\xA8\xD8\xB1\xD9\x8A\xD8\xAF" en UTF-8 bytes; quitar el bit superior de los bytes y se obtiene "X(X1Y\nX/" ASCII.

La manera de obtener caracteres no ASCII en un cuerpo de correo es establecer Content-Transfer-Encoding a cualquiera base64 o quoted-printable, y la codificación del cuerpo con base64_encode o quoted_printable_encode, respectivamente.

(quoted-printable es mejor si el correo es en gran parte ASCII, ya que conserva la legibilidad en forma codificada y es más eficiente para ASCII. Si todo el correo electrónico es el árabe, base64 probablemente sería la mejor opción.)

Otros consejos

        $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);

Esta funciona para mí.

Probar

$headers .= 'From: =?UTF-8?B?'.base64_encode($from). "\r\n";

Su código funciona para mí como está.

¿Está seguro de que $message contiene una cadena válida UTF-8?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top