Comment puis-je envoyer des e-mails avec un contenu arabe via la fonction mail de PHP?

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

  •  22-09-2019
  •  | 
  •  

Question

Je vais avoir un problème avec l'envoi de courriels avec du contenu arabe en utilisant la fonction mail de PHP. Disons que j'ai cette simple chaîne arabe:

بريد

J'ai essayé plusieurs façons d'utiliser les en-têtes, mais le contenu des e-mails tous finissent toujours avec quelque chose comme: X*X1X(X1Y X/. Cependant, l'objet du message est codé correctement si j'utilise des caractères arabes (grâce à la base64_encode, voir la fonction ci-dessous)

Voici une des fonctions e-mail que j'ai essayé

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

Toutes les suggestions sur d'autres moyens pour atteindre cet objectif?

Était-ce utile?

La solution

Malheureusement, l'encodage 8bit n'est pas fiable dans l'e-mail. De nombreux agents de transport de courrier enlèveront le bit haut de chaque octet dans le corps du message. بريد est "\xD8\xA8\xD8\xB1\xD9\x8A\xD8\xAF" en octets UTF-8; retirer le bit haut de ces octets et vous obtenez "X(X1Y\nX/" ASCII.

La façon d'obtenir des caractères non-ASCII dans un corps de courrier est de mettre Content-Transfer-Encoding soit base64 ou quoted-printable, et encode le corps avec base64_encode ou quoted_printable_encode respectivement.

(quoted-printable vaut mieux si le courrier est en grande partie ASCII car il conserve la lisibilité sous forme codée et est plus efficace pour ASCII. Si le courrier entier est l'arabe, base64 serait probablement le meilleur choix.)

Autres conseils

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

Celui-ci fonctionne pour moi.

Essayer cette

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

Votre code fonctionne pour moi-est.

Êtes-vous sûr que $message contient une chaîne valide UTF-8?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top