picture picture
mars 26, 2010 PHP 22 Commentaires

Envoyer un mail PHP au format texte sans erreurs d’encodage …

Je trouve toujours géniaux les tutoriaux qui commencent pas « envoyer un mail au format texte avec la fonction mail() de PHP, c’est super simple… » (sous entendu : « en HTML par contre, pfoulala, ça c’est super dur :p « )

Personnellement j’ai toujours trouvé cela assez pénible : selon le logiciel de courrier du client, on a des erreurs d’encodage avec des signes cabalistiques partout dans 50% des cas ! Testez sur un iPhone, vous verrez …

Voilà ce que je fais pour éviter les erreurs, c’est pas sorcier mais au moins cela marche !

1. Récupérer les données à envoyer au bon format

D’abord la page où se trouve le formulaire de saisie, ou les données extraites de la base des données à envoyer, doivent être encodées en UTF-8 :

En-tête de la page du formulaire :

<head>
...
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...
</head>

(pour les données extraites des bases voir le billet Web Tolosa sur ce sujet ici)

2. Préciser le type d’encodage utilisé dans l’en-têtes du mail : UTF-8

pourquoi UTF8 ? parce que les clients mails de pas mal de smartphones (Blackberry, iPhones, etc.) sont encodés en UTF8 et que de plus en plus de français les utilisent…

Donc le mail à envoyer sera formaté ainsi (on va prendre le cas de données récupérées depuis un formulaire en POST mais c’est pareil pour des données extraites d’une base des données):

$headers ='From: '.$_POST['mail']." "; // ici l'expediteur du mail
$headers .='Reply-To: '.$_POST['mail']." "; // ici l'adresse de réponse (facultatif)
$headers .='Content-Type: text/plain; charset="utf-8"'." "; // ici on envoie le mail au format texte encodé en UTF-8
$headers .='Content-Transfer-Encoding: 8bit'; // ici on précise qu'il y a des caractères accentués

3. Mettre en forme le message

La suite est plus classique. Par exemple pour la mise en forme possible des données d’un formulaire :

$message = " ";
$message .= "Message de ".$_POST['prenom']." ".$_POST['Nom']." ";
$message .= "Adresse : ".$_POST['Adresse']." - ".$_POST['Code-Postal']." - ".$_POST['Ville']." ";
$message .= "Tel : ".$_POST['Tel']." ";
$message .= "E-mail : ".$_POST['mail']." ";
$message .= "Texte du message : ";
$message .= "======== ";
$message .= $_POST['Message']." ";
$message .= "======== ";
$message .= "Envoi le ".date("d/m/Y - H:i");

4. Envoyer avec la fonction mail()…

Il n’y a plus qu’à l’envoyer tel quel avec la fonction mail() la plus simple :

if(mail("destinataire@fai.com", "Le sujet : message depuis mon formulaire", $message, $headers)) {
header("location: formulaire.php?error=0");
exit;
}

else {
header(« location: formulaire.php?error=1 »);
exit;
}

Bala… en principe ça marche partout ! ;)

22 Responses to “Envoyer un mail PHP au format texte sans erreurs d’encodage …”

22 Commentaires

  1. webtolosa dit :

    Tu sembles avoir un problème de configuration du SMTP de ton serveur local : tu exécutes bien tes script PHP depuis ton ordinateur ?
    Essaye de mettre en ligne ta page PHP sur ton serveur en ligne (OVH ou autre) et tente d’exécuter depuis le web le fichier qui contient ton script mail(). En principe les serveurs mail des serveurs web sont bien configurés.

  2. lina dit :

    aucun résultat et aucun spam.

  3. webtolosa dit :

    Bonjour,
    le mail n’est pas non plus dans ta boite de spam (courriers indésirables) de Yahoo ? Essaye d’envoyer à une autre adresse (Gmail, hotmail ou ce que tu veux)

  4. lina dit :

    slt
    maintenant il m’affiche ce msg:
    La fonction mail() fonctionne. Un e-mail a ete envoye a l’adresse khelassi.linda@yahoo.fr. S’il ne vous parvient pas, il y a probablement un blocage au niveau du serveur SMTP de votre hebergeur.
    donc comment je règle ce blocage! car je ne reçoit rien

    merci pr votre aide

  5. lina dit :

    salut a tous ^^
    Monsieur j’ai modifie le fichier php.ini comme:
    [mail function]
    ; For Win32 only.
    ; http://php.net/smtp
    SMTP = smtp.orange.fr
    ; http://php.net/smtp-port
    smtp_port = 25

    ; For Win32 only.
    ; http://php.net/sendmail-from
    sendmail_from = khelassi.linda@gmail.com

    ; For Unix only. You may supply arguments as well (default: « sendmail -t -i »).
    ; http://php.net/sendmail-path
    sendmail_path = « C:\wamp\sendmail\sendmail.exe »

    et voila le code test que vous m’avez donné, aucune erreurs mais je ne reçoit rien

    merci pour votre aide!

  6. webtolosa dit :

    Bonjour Linda,
    déjà, tu commence par dire « STP » et « merci » ;-) Ensuite tu demandes à l’admin. réseau de ton serveur de configurer la fonction mail() sur le fichier php.ini de ton serveur.
    Et si tu es en local, tu vas sur le fichier php.ini de ton serveur local et tu renseignes la ligne SMTP avec le smtp de ton FAI (par ex. : SMTP = « smtp.orange.fr »).
    Cherche sur Google c’est très simple.

  7. lina dit :

    Il envoie « L’envoi par la fonction PHP mail() ne fonctionne pas ou est desactivee ! », alrs comment je l’active !

  8. webtolosa dit :

    Vérifie si la fonction mail() est activée sur ton serveur en executant un fichier test.php qui contient le code suivant (si tu ne reçois pas de mail le pb vient de ton serveur) :
    < ?php $dest = "ton e-mail"; $envoi = mail($dest, "Ceci est un test", "Ceci est un test de la fonction mail()", "From: $dest"); if ($envoi == true) { echo "La fonction mail() fonctionne. Un e-mail a ete envoye a l'adresse $dest. S'il ne vous parvient pas, il y a probablement un blocage au niveau du serveur SMTP de votre hebergeur."; } else { echo "L'envoi par la fonction PHP mail() ne fonctionne pas ou est desactivee !"; } ?>

  9. lina dit :

    Voila mn code j’ai resolu tous les prblms mais il envoie rien

    <?php
    $mail = 'khelassi.linda@yahoo.fr'; // Déclaration de l'adresse de destination.
    if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) // On filtre les serveurs qui rencontrent des bogues.
    {
        $passage_ligne = "\r\n";
    }
    else
    {
        $passage_ligne = "\n";
    }
    //=====Déclaration des messages au format texte et au format HTML.
    $message_txt = "Salut à tous, voici un e-mail envoyé par un script PHP.";
    $message_html = "Salut à tous, voici un e-mail envoyé par un script PHP. »;
    //==========
      
    //=====Création de la boundary
    $boundary = « —–= ».md5(rand());
    //==========
      
    //=====Définition du sujet.
    $sujet = « Hey mon ami ! »;
    //=========
      
    //=====Création du header de l’e-mail.
    $header = « From: \ »khelassi\ » ».$passage_ligne;
    $header.= « Reply-to: \ »linda\ » « .$passage_ligne;
    $header.= « MIME-Version: 1.0 ».$passage_ligne;
    $header.= « Content-Type: multipart/alternative; ».$passage_ligne. » boundary=\ »$boundary\ » ».$passage_ligne;
    //==========
      
    //=====Création du message.
    $message = $passage_ligne. »–« .$boundary.$passage_ligne;
    //=====Ajout du message au format texte.
    $message.= « Content-Type: text/plain; charset=\ »ISO-8859-1\ » ».$passage_ligne;
    $message.= « Content-Transfer-Encoding: 8bit ».$passage_ligne;
    $message.= $passage_ligne.$message_txt.$passage_ligne;
    //==========
    $message.= $passage_ligne. »–« .$boundary.$passage_ligne;
    //=====Ajout du message au format HTML
    $message.= « Content-Type: text/html; charset=\ »ISO-8859-1\ » ».$passage_ligne;
    $message.= « Content-Transfer-Encoding: 8bit ».$passage_ligne;
    $message.= $passage_ligne.$message_html.$passage_ligne;
    //==========
    $message.= $passage_ligne. »–« .$boundary. »–« .$passage_ligne;
    $message.= $passage_ligne. »–« .$boundary. »–« .$passage_ligne;
    //==========
      
    //=====Envoi de l’e-mail.
    mail($mail,$sujet,$message,$header);
    //==========
    ?>

  10. webtolosa dit :

    « error » c’est une erreur PHP… débugue ton code (les « ; » en fin de ligne, les erreurs de scripts, etc… il y a tant d’erreurs possible !!)
    Et ne fait pas de copier-coller des codes depuis le net.

  11. lina dit :

    Il m’envoie error! svp aidez moi!

  12. antoine dit :

    Merci l’article et le utf8_decode() qui a résolut mon problème.
    Antoine.
    Voila mon code qui marche chez l’hebergeur Gandi

    $to = $_POST[’email’];
    $subject = ‘La vie sur Paris..’;
    $message = ‘Bonjour ‘. utf8_decode($_POST[‘prenom’]) .’ ‘. utf8_decode($_POST[‘nom’]) .’, merci pour votre message. Je vais bientôt vous répondre. Antoine’;
    $headers = ‘From: toto@icloud.com‘ . « \r\n » .
    ‘Reply-To: toto@icloud.com‘ . « \r\n » .
    ‘Content-Type: text/plain; charset= »utf-8″‘ . « \r\n » .
    ‘Content-Transfer-Encoding: 8bit’. « \r\n » .
    ‘X-Mailer: PHP/’ . phpversion();
    mail($to, $subject, $message, $headers);

  13. Ferire dit :

    Ne fonctionne pas sous outlook 2013 chez moi

  14. Franck Eméry dit :

    Bonjour moi je n’arrive toujours pas si quelqu’un veut bien m’aider.
    je reçois toujours les messages avec les caractère spéciaux HTML
    Voici mon code PHP

    <?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(preg_replace("[^a-zA-Z0-9éèàäö\ -]", "", $f_1)));
    $f_2=strip_tags(trim($f_2));
    $f_3=trim(preg_replace("[^0-9\ +]", "", $f_3));
    // Verification des champs
    if(strlen($f_1)<2){
    $erreur.="Le champ « Nom » est vide ou incomplet. »;
    $errf_1=1;
    }
    if(strlen($f_2)<2){
    $erreur.="Le champ « Email » 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_3)<2){
    $erreur.="Le champ « Téléphone » est vide ou incomplet. »;
    $errf_3=1;
    }
    if(strlen($f_5)<2){
    $erreur.="Le champ « Message » est vide ou incomplet. »;
    $errf_5=1;
    }
    if($erreur== » »){
    // Création du message

    $titre= »Message du formulaire »;
    $tete= »From:Site@Rochme.com\n »;
    $corps.= »Nom : « .$f_1. »\n »;
    $corps.= »Email : « .$f_2. »\n »;
    $corps.= »Téléphone : « .$f_3. »\n »;
    $corps.= »Entreprise : « .$f_4. »\n »;
    $corps.= »Message : « .$f_5. »\n »;
    if(mail(« contact@rochme.com », $titre, stripslashes($corps) , $tete)){
    $ok_mail= »true »;
    }else{
    $erreur.= »Une erreur est survenue lors de l’envoi du message, veuillez refaire une tentative. »;
    }
    }
    }
    ?>

  15. Jean-Loïc dit :

    Merci pour ce tuto très clair et concis. Le Php est décidément un langage de programmation formidable.

  16. peter45 dit :

    :D Merci beaucoup pour cette astuce.
    En peu de temps, une recherche sur le net m’à donné la solution au problème des lettres accentuées qui passaient en dans le courriel de l’Iphone.

    J’ai dû rajouter des \r\n à la fin des lignes $headers :
    $headers = ‘From: administrateur ‘.’\r\n’ ;
    $headers .=’Content-Type: text/plain; charset= »utf-8″‘.’\r\n’;
    $headers .=’Content-Transfer-Encoding: 8bit’;

    Le message du courriel étant extrait d’un fichier texte, j’ai du aussi l’encoder en UTF8 : $message = utf8_encode($message);

  17. Deyer dit :

    Merci, c’est exactement ce que je cherchais !

  18. Bruno Soufo dit :

    Merci pour l’astuce. Tu me sauves la vie

  19. Cla94800 dit :

    Ca marche nickel, merci…Je me débattais depuis 1 siècle avec les caractères accentués ! :mrgreen:

    Claude

  20. luan dit :

    Super ce tuto, c’est ce que je cherchais… Néanmoins je débute en php et quelques points m’échappent. Serait-il possible d’avoir un exemple concret ?
    Merci

  21. john dit :

    exact.
    on peut aussi rajouter un utf8_decode($var) si on extrait/insere des variables d’une base des données encodée en UTF-8 directement dans le corps du mail, sinon on a des caractères spéciaux non reconnus par les iphones par exemple

  22. yoman dit :

    testé et approuvé. Thx man

Commentaire

Name

Mail (ne sera pas publié)

Website

Laisser ces deux champs tels quels :
:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: