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=\"ISO-8859-1\"; 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.
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.
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()
Auteur : Mr Xhark
Fondateur du blog et passionné par les technologies je partage mes découvertes quotidiennement.












Déjà 7 commentaires
21 novembre 2007 à 17h15
Bonjour,
c’est utf8_decode(utf8_encode(
ou utf8_encode(utf8_decode( ?
24 novembre 2007 à 22h48
C’est : utf8_decode(utf8_encode($variable))
j’ai corrigé le texte (il y avait une erreur), le code source était lui par contre correct
Merci pour ta remarque
5 juin 2008 à 23h19
Excellent, grace à ça je peux envoyer mes mails vers hotmail sans souci.
merci xhark
15 juin 2008 à 1h03
J’en profite pour donner un lien sur lequel je suis tombé qui propose une solution alternative : http://pilgrim.maleo.net/2008/02/fonction-mail-envoyer-un-sujet-avec-des-accents
6 mars 2009 à 11h59
Ne marche pas sous laposte.net
affiche des carré au lieu des accents
Affiche »
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
X-Ovh-Tracer-Id: xxxxxxxxxxxxxxxxx
X-Ovh-Remote: xx.xxx.xxx.xx (xxxxxxxxxx.com)
X-Ovh-Local: xxx.xxx.xx.xx (xxx.xx.com)
X-Spam-Check: DONE|H 0.5/N »
Sous Thuderbird ET OULOOK
et mets les mails en SPAM sous yahoo.fr
Y a-t-il une solution?
Merci
24 février 2010 à 17h38
Bonjour à tous,
pour moi ça ne marchait pas sur Orange.fr !
J’ai essayé plusieurs solutions et je suis tombé ici grâce à Mister google.
J’ai fait l’essais avec les codes du post ci-dessus. Mais c’était pareil… J’avais cependant pas exactement réécrit le code. J’avais placé le « MIME-Version: 1.0″ avant le « Content-Type ». J’ai changé l’ordre d’écriture, c’est-à-dire comme celui de Mr Xhark.
Maintenant ça marche !!!
8 octobre 2011 à 10h22
Merci, c’est genial!