Caractères non reconnus dans un formulaire de mail

Eléphant du PHP | 193 Messages

20 mars 2007, 10:15

Bonjour à tous!

Je travaille actuellement sur un formulaire de mail, et j'ai un problème de caractères. En effet, lorsque je reçois un mail dans lequel j'ai intégré des accents ou des apostrophes, voilà ce que j'obtiens :
"J\'aimerais à être", au lieu de:
"J'aimerais à être"

C'est un peu moins lisible: j'ai intégré htmlentities() pour empêcher de rentrer du code malicieux.

Voici mon code sur la page d'envoi du formulaire:
<?php
if ($_POST['categorie'] == 1){$to = "[email protected]";
}else if
($_POST['categorie'] == 2){$to = "[email protected]";
}else if
($_POST['categorie'] == 3){$to = "[email protected]";}
$subject = htmlentities($_POST['sujet']);
$body = htmlentities($_POST['type']).' '.htmlentities($_POST['corps']);
$headers = "From: " . htmlentities($_POST['adresseemail']) . "\n";
mail($to,$subject,$body,$headers);
?>
[edit]Si je supprime htmlentities(), (ça risque de poser des problèmes de sécurité), j'ai seulement des "\" qui se mettent devant les apostrophes...: et c'est déjà moyen.

Pourriez-vous m'aider s'il vous plaît? Merci par avance!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 mars 2007, 10:47

htmlentities() convertit les caractères spéciaux en entités html... donc pour faire du html... et si tu met du html dans un mail en texte brut, cela t'affiche ton html en texte brut ;)

Si tu veux que le html soit interprété pour que les accents et autres apparaissent correctement, il faut spécifier dans l'entête de ton mail qu'il s'agit d'un flux html :)

Si en revanche tu veux conserver le format texte brut, tu peux virer le htmlentities sans soucis, le client de messagerie n'interpretera pas le html (au pire, si tu veux être tranquile, tu fais un strip_tags() :)). Quant aux \ qui protèges apostrophes et guillemets, c'est la configuration de ton serveur qui fait que php effectues un addslashes sur toutes les variables reçues en GET ou en POST. Tu peux donc soit modifier le php.ini pour qu'il ne le fasse jamais, soit tout simplement faire un stripslashes() pour les retirer quand tu n'en a pas besoin :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 193 Messages

20 mars 2007, 11:21

Hello!

Mon nouveau code est le suivant car je préfère conserver ma configuration du .ini.
<?php
if ($_POST['categorie'] == 1){$to = "[email protected]";
}else if
($_POST['categorie'] == 2){$to = "[email protected]";
}else if
($_POST['categorie'] == 3){$to = "[email protected]";}
$subject = stripslashes($_POST['sujet']);
$body = stripslashes($_POST['type']).' '.stripslashes($_POST['corps']);
$headers = "From: " . stripslashes($_POST['adresseemail']) . "\n";
mail($to,$subject,$body,$headers);
?>
Cela fonctionne parfaitement: pas d'accent, pas d' \ avant les apostrophes. One more victory for Ryle!

Merci beaucoup!
[/php]