Caracteres speciaux et formulaire ?

Eléphanteau du PHP | 25 Messages

10 mai 2009, 20:35

Bonjour à tous,
j'ai fait un formulaire de contact sur mon site internet, mais le problème c'est que les caractères speciaux lorsque je fait des tests d'envoi dans ma boîte mail s'affichent mal.

Par exemple, si j'envoi le message suivant:

Bonjour,
je souhaiterai être contacté à l'email suivant:
contact <[email protected]>

merci beaucoup
john

Lorsque je recoit le message dans ma boite de reception d'email, il s'affiche comme cela:

Bonjour,<br />
je souhaiterai être contacté à l'email suivant:<br />
contact <[email protected]><br />
<br />
merci beaucoup<br />
john

Voici le code de traitement du formulaire:

Code : Tout sélectionner

<?php /* ******************************************************************************************** CONFIGURATION ******************************************************************************************** */ // destinataire est votre adresse mail. Pour envoyer à plusieurs à la fois, séparez-les par une virgule $destinataire = '[email protected]'; // copie ? (envoie une copie au visiteur) $copie = 'oui'; // 'oui' ou 'non' // Messages de confirmation du mail $message_envoye = "Votre message nous est bien parvenu ! Vous allez recevoir une copie de votre message dans votre boîte mail."; $message_non_envoye = "L'envoi du mail a échoué, veuillez réessayer SVP."; // Messages d'erreur du formulaire $message_erreur_formulaire = "Vous devez d'abord <a href=\"contact.php\">envoyer le formulaire</a>."; $message_formulaire_invalide = "Vérifiez que tous les champs soient bien remplis et que l'email soit sans erreur."; /* ******************************************************************************************** FIN DE LA CONFIGURATION ******************************************************************************************** */ // on teste si le formulaire a été soumis if (!isset($_POST['envoi'])) { // formulaire non envoyé echo '<p>'.$message_erreur_formulaire.'</p>'."\n"; } else { /* * cette fonction sert à nettoyer et enregistrer un texte */ function Rec($text) { $text = trim($text); // delete white spaces after & before text if (1 === get_magic_quotes_gpc()) { $stripslashes = create_function('$txt', 'return stripslashes($txt);'); } else { $stripslashes = create_function('$txt', 'return $txt;'); } // magic quotes ? $text = $stripslashes($text); $text = htmlspecialchars($text, ENT_QUOTES); // converts to string with " and ' as well $text = nl2br($text); return $text; }; /* * Cette fonction sert à vérifier la syntaxe d'un email */ function IsEmail($email) { $pattern = "^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,7}$"; return (eregi($pattern,$email)) ? true : false; }; // formulaire envoyé, on récupère tous les champs. $monsieur = (isset($_POST['monsieur'])) ? Rec($_POST['monsieur']) : ''; $madame = (isset($_POST['madame'])) ? Rec($_POST['madame']) : ''; $moiselle = (isset($_POST['moiselle'])) ? Rec($_POST['moiselle']) : ''; $nom = (isset($_POST['nom'])) ? Rec($_POST['nom']) : ''; $email = (isset($_POST['email'])) ? Rec($_POST['email']) : ''; $message = (isset($_POST['message'])) ? Rec($_POST['message']) : ''; $telephone = (isset($_POST['tel'])) ? Rec($_POST['tel']) : ''; $ville = (isset($_POST['ville'])) ? Rec($_POST['ville']) : ''; $societe = (isset($_POST['societe'])) ? Rec($_POST['societe']) : ''; // On va vérifier les variables et l'email ... $email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré if (($nom != '') && ($email != '') && ($message != '') && ($telephone != '') && ($ville != '') && ($societe != '')) { // les 4 variables sont remplies, on génère puis envoie le mail $headers = 'De: '.$nom.' <'.$email.'>' . "\r\n" . 'Téléphone: '.$telephone.'' . "\r\n" . 'Société: '.$societe.'' . "\r\n" . 'Message: '.$message.'' . "\r\n"; // envoyer une copie au visiteur ? if ($copie == 'oui') { $cible = $destinataire.','.$email; } else { $cible = $destinataire; }; // Remplacement de certains caractères spéciaux $message = str_replace("'","'",$message); $message = str_replace("’","'",$message); $message = str_replace(""",'"',$message); $message = str_replace('<br>','',$message); $message = str_replace('<br />','',$message); $message = str_replace("<","<",$message); $message = str_replace(">",">",$message); $message = str_replace("&","&",$message); // Envoi du mail if (mail($cible, $message, $headers)) { echo '<p>'.$message_envoye.' <a href="http://www.XXXXXXXXXXXXXX.fr/contact.php">Cliquez-ici pour revenir au formulaire</a></p>'."\n"; } else { echo '<p>'.$message_non_envoye.' <a href="http://www.XXXXXXXXXXXXXXX.fr">Retour au formulaire</a></p>'."\n"; }; } else { // une des 3 variables (ou plus) est vide ... echo '<p>'.$message_formulaire_invalide.' <a href="http://www.XXXXXXXXX.fr/contact.php">Retour au formulaire</a></p>'."\n"; }; }; // fin du if (!isset($_POST['envoi'])) ?>

Pourriez-vous m'aider s'il vous plait ?
Merci beaucoup.

ViPHP
ViPHP | 4674 Messages

10 mai 2009, 23:07

Hey :-),

Bien sûr qu'on peut t'aider. Un p'tit coup d'oeil dans la documentation sur la fonction html_entity_decode() serait apprécié peut-être :-) ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
AB
ViPHP | 5818 Messages

11 mai 2009, 00:33

L'est un peu alambiqué ton code...
C'est ta fonction Rec qui génère les caractères que tu as en trop dans ton message, notamment à l'intérieur de celle-ci les fonctions nl2br() et htmlspecialchars() qui habituellement sont utilisées pour l'affichage et non pas pour l'enregistrement.

Essaies de mettre
      // On va vérifier les variables et l'email ...
      $email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré

      if (($nom != '') && ($email != '') && ($message != '') && ($telephone != '') && ($ville != '') && ($societe != ''))
      {

         // Remplacement de certains caractères spéciaux
         $message = str_replace("'","'",$message);
         $message = str_replace("’","'",$message);
         $message = str_replace(""",'"',$message);
         $message = str_replace('<br>','',$message);
         $message = str_replace('<br />','',$message);
         $message = str_replace("<","<",$message);
         $message = str_replace(">",">",$message);
         $message = str_replace("&","&",$message);


         // les 4 variables sont remplies, on génère puis envoie le mail
         $headers = 'De: '.$nom.' <'.$email.'>' . "\r\n" . 'Téléphone: '.$telephone.'' . "\r\n" . 'Société: '.$societe.'' . "\r\n" . 'Message: '.$message.'' . "\r\n";           

         // envoyer une copie au visiteur ?
         if ($copie == 'oui')
         {
            $cible = $destinataire.','.$email;
         }
         else
         {
            $cible = $destinataire;
         };


         // Envoi du mail
         if (mail($cible, $message, $headers))
         {
            echo '<p>'.$message_envoye.'   <a href="http://www.XXXXXXXXXXXXXX.fr/contact.php">Cliquez-ici pour revenir au formulaire</a></p>'."\n";
         }
         else
         {
            echo '<p>'.$message_non_envoye.'  <a href="http://www.XXXXXXXXXXXXXXX.fr">Retour au formulaire</a></p>'."\n";
         };
      }
      else
      {
         // une des 3 variables (ou plus) est vide ...
         echo '<p>'.$message_formulaire_invalide.' <a href="http://www.XXXXXXXXX.fr/contact.php">Retour au formulaire</a></p>'."\n";
      };
   }; // fin du if (!isset($_POST['envoi'])) 
à la place du bloc // On va vérifier les variables et l'email ... ou sinon essaies de suivre les conseils de hywan.

Mais il y a un soucis dans ta fonction mail() : le deuxième argument est le sujet, non pas le message cf la fonction mail()