2010-02-25 6 views
4

Je rencontre des difficultés pour envoyer des emails avec du contenu arabe en utilisant la fonction mail de PHP. Disons que j'ai cette simple chaîne arabe:Comment envoyer des emails avec du contenu arabe via la fonction mail de PHP?

بريد

J'ai essayé plusieurs façons de tous finissent toujours utiliser les en-têtes, mais le contenu des e-mails 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)

est ici l'une des fonctions de courrier électronique 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 façons de atteindre cet objectif?

+0

Je ne comprends pas. Quel est le problème? vous dites que le sujet de l'e-mail est correctement encodé ... cela ne fonctionne-t-il pas aussi bien pour le corps? – Teekin

+0

Correct, l'objet de l'e-mail peut être affiché correctement en utilisant base64_encode, mais vous ne pouvez pas utiliser base64_encode ($ email_content). Voir la fonction d'exemple ci-dessus. – Coreus

Répondre

6

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

La manière 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 est meilleur 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.)

+0

J'ai modifié la fonction pour utiliser base64_encode en tant que Content-Transfer-Encoding: Base64 et OMG! Ça marche!!! Hourra! – Coreus

+0

Pourquoi l'encodage 8 bits n'est-il pas fiable dans le courrier électronique? J'ai envoyé des emails en hébreu encodés UTF-8 régulièrement. Quel MTA supprime le bit supérieur de chaque octet dans le corps? – dotancohen

+0

TBH Je ne sais plus - sendmail n'avait pas l'habitude de travailler mais c'était il y a longtemps. Mon instinct suggère peut-être que les fournisseurs mobiles pourraient encore avoir un kit de transport 7 bits et la gestion du chemin mail personnalisé mentir? – bobince

0
 $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.

0

Essayez cette

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

Votre le code fonctionne pour moi tel quel.

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

Questions connexes