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
12 commentaires
Bonjour,
c'est utf8_decode(utf8_encode(
ou utf8_encode(utf8_decode( ?
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 🙂
Excellent, grace à ça je peux envoyer mes mails vers hotmail sans souci.
merci xhark
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
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
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 !!!
Merci, c'est genial!
Bonjour,
J'ai ce code pour envoyé un mail, je voudrais qu'il envoi mon $corps en UTF-8
Quelqu'un peut m'aider?
<?php
// Couleur du texte des champs si erreur saisie utilisateur
$color_font_warn="#FF0000";
// Couleur de fond des champs si erreur saisie utilisateur
$color_form_warn="#FFCC66";
// Ne rien modifier ci-dessous si vous n’êtes pas certain de ce que vous faites !
if(isset($_POST['submit'])){
$erreur="";
// Nettoyage des entrées
while(list($var,$val)=each($_POST)){
if(!is_array($val)){
$$var=strip_tags($val);
}else{
while(list($arvar,$arval)=each($val)){
$$var[$arvar]=strip_tags($arval);
}
}
}
// Formatage des entrées
$f_1=trim(ucwords(eregi_replace("[^a-zA-Z0-9éèàäö\ -]", "", $f_1)));
$f_2=strip_tags(trim($f_2));
$f_3=trim(eregi_replace("[^0-9\ +]", "", $f_3));
// Verification des champs
if(strlen($f_1)<2){
$erreur.="Le champ « Votre nom: » est vide ou incomplet.";
$errf_1=1;
}
if(strlen($f_2)<2){
$erreur.="Le champ « Courriel: » est vide ou incomplet.";
$errf_2=1;
}else{
if(!ereg('^[-!#$%&\'*+\./0-9=?A-Z^_`a-z{|}~]+'.
'@'.
'[-!#$%&\'*+\/0-9=?A-Z^_`a-z{|}~]+\.'.
'[-!#$%&\'*+\./0-9=?A-Z^_`a-z{|}~]+$',
$f_2)){
$erreur.="La syntaxe de votre adresse e-mail n'est pas correcte.";
$errf_2=1;
}
}
if(strlen($f_4)<2){
$erreur.="Le champ « Message: » est vide ou incomplet.";
$errf_4=1;
}
if($erreur==""){
// Création du message
$titre="Message de votre site";
$tete="From:Mechoui Party\n";
$corps.="Votre nom: : ".$f_1."\n";
$corps.="Courriel: : ".$f_2."\n";
$corps.="Numéro de téléphone: : ".$f_3."\n";
$corps.= "Message: ".$f_4."\n";
if(mail("info@groupegdi.com", $titre, stripslashes($corps), $tete)){
$ok_mail="true";
}else{
$erreur.="Une erreur est survenue lors de l'envoi du message, veuillez refaire une tentative.";
}
}
}
?>@Racer62:
Comment faire pour les lettres accentuée dans le nom du destinataire ?
$destinataire = 'François éàù ';
provoque une erreur...
Désolé, le filtrage des chevrons a rendu mon message incompréhensible...
Comment faire pour les lettres accentuée dans le nom du destinataire ?
$destinataire = ‘François éàù <francois@gmail.com>‘;
provoque une erreur…
@Telsat: ton erreur vient de l'apostrophe après ton "=" elle n'est pas valable.