Comment puis-je envoyer des e-mails avec un contenu arabe via la fonction mail de PHP?
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?
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?