(modifié le 5 mars 2013 à 11:10)

But : envoyer un email à l'aide du langage de programmation PHP au format text (text/plain) contenant des accents via la fonction mail()

Envoyer des emails grâce à un serveur web est très utile dans le domaine de la conception web (webmaster). Dans mon cas j'utilise le serveur PHP Apache qui est à l'heure actuelle le plus abouti et possède l'avantage d'être open-source. Le système d'exploitation dans mon cas est un Linux (Debian 4.0) mais pour cet exemple vous ne verrez aucune différence si votre système est composé de Microsoft Windows (ou autre...).

J'ai souvent lutté pour envoyer des emails dans la langue de Molière et ce, à cause de nos accents 🙂 En effet les programmeurs étant des personnes parlant anglais, ils ne pensent pas en priorité aux problèmes qui pourraient survenir dans d'autres langues un tant soit peu exotiques telles que le Français.

Suite à de nombreux tests j'en ai conclu que les accents ne sont pas gérés de la même façon sur tous les clients mail. La méthode que je vous présente fonctionne sur tous les clients emails que j'ai pu testé : Hotmail, Gmail, Free, Outlook, Thunderbird, Yopmail (email jetable).

Voici le code source :

// précisons le destinataire
$destinataire = 'toto@gmail.com';
$entete = "From: Robot <noreply@monsite.com> \r\n";
$entete .= "Reply-To: contact@monsite.com \r\n";
$entete .= "Content-Type: text/plain; charset=\"utf-8\"; DelSp=\"Yes\"; format=flowed \r\n";
$entete .= "Content-Disposition: inline \r\n";
$entete .= "Content-Transfer-Encoding: 7bit \r\n";
$entete .= "MIME-Version: 1.0";
$objet = "Objet de votre message email";
$message = "Bonjour,\n\n";
$message .= "voici un test t'envoi d'un email en php avec quelques accents : éàù\n";
$message .= "Cordialement,\n Monsite.com\n";
if(mail($destinataire,$objet,utf8_decode(utf8_encode($message)),$entete))
echo "Envoi email OK (<i>".$destinataire."</i>)";
else
echo "Envoi KO";

Quelques explications
Vous devez mettre les accents dans l'email tel que vous les lisez, c'est à dire ne les encodez pas tel que vous pourriez le faire en (x)HTML ISO-8859-1.
De cette façon grâce aux fonctions successives utf8_decode(utf8_encode($variable)) PHP transforme le mail en UTF8 (dans le cas ou des caractères non encodés pourraient exister) puis cet encodage UTF8 est transformé en ISO-8859-1.

Edit au 14/01/2013 : passage du code en UTF-8. Votre fichier .php doit lui aussi être en UTF-8, avec Notepad++ passer via Menu encodage > Convertir en UTF-8 (sans BOM) pour le convertir.

C'est de cette manière que les emails sont envoyés de manière générale sur le web donc cela tombe bien non ?

Autre petite astuce d'encodage en UTF-8 car vous n'avez peut-être pas forcément le même problème que moi mais peut-être qu'il s'en rapproche :

$newstring = html_entity_decode(htmlentities($utf8_string, ENT_COMPAT, 'UTF-8'));


Note : les utilisateurs d'EasyPHP, WAMP et autres serveurs Windows PHP/MySQL clés en main doivent modifier la valeur du serveur SMTP dans le fichier php.ini

Doc. fonction mail()
Doc. fonction utf8_encode()
Doc. fonction utf8_decode()
Mails en HTML avec PJ

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter