Formulaire PHP
nicos91
-
js95 Messages postés 773 Date d'inscription Statut Membre Dernière intervention -
js95 Messages postés 773 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
Je suis débutant en PHP et j'ai réalisé pour un site un formulaire de contact permettant d'envoyer un mail à différentes personnes selon le bouton radio coché par l'internaute.
Pour tester cet envoi de mail j'utilise WAMPSERVER.
Or le problème c'est que j'arrivais à envoyer les mails comme il faut, mais depuis que j'ai touché à quelque chose dans le code PHP (je ne sais pas quoi) cela ne fonctionne plus.
Voici mon code PHP pour l'un des boutons radio coché :
Merci d'avance ! :)
Nicolas
Je suis débutant en PHP et j'ai réalisé pour un site un formulaire de contact permettant d'envoyer un mail à différentes personnes selon le bouton radio coché par l'internaute.
Pour tester cet envoi de mail j'utilise WAMPSERVER.
Or le problème c'est que j'arrivais à envoyer les mails comme il faut, mais depuis que j'ai touché à quelque chose dans le code PHP (je ne sais pas quoi) cela ne fonctionne plus.
Voici mon code PHP pour l'un des boutons radio coché :
<?php $erreur = NULL; $info = NULL; if(!empty($_POST['nom']) && !empty($_POST['prenom']) && !empty($_POST['email']) && !empty($_POST['message'])) { extract($_POST); if($_POST['RadioGroup1'] == 'webmaster') { if(preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#",$email)) { $nom = htmlspecialchars(addslashes($nom)); $prenom = htmlspecialchars(addslashes($prenom)); $email = htmlspecialchars(addslashes($email)); $destinataire = "test@hotmail.com"; $sujet = "Formulaire de contact"; $entete = "From:$nom \n Reply-To:$email \n"; $entete = "Content-type: text/html; charset=utf-8"; $message = htmlentities($message, ENT_QUOTES, "UTF-8"); $message = "Vous venez de recevoir un nouveau message en provenance du site www.alsatiadrusenheim.fr \n\n Nom : $nom \n\n Prenom : $prenom \n\n Email : $email \n\n Message : $message"; mail($destinataire, $sujet, $message, $entete); $info = "Votre message a bien été envoyé."; unset($_POST, $message, $nom, $prenom, $email); } else { $erreur="Adresse e-mail invalide"; } } ...
Merci d'avance ! :)
Nicolas
A voir également:
- Formulaire PHP
- Whatsapp formulaire opposition - Guide
- Formulaire de réclamation facebook - Guide
- Formulaire de reclamation instagram - Guide
- Easy php - Télécharger - Divers Web & Internet
- Confirmer le nouvel envoi du formulaire err_cache_miss - Forum Webmastering
8 réponses
Désolé, j'ai dû me tromper, cette partie du code ne doit pas poser problème car le $message est réintroduit dans le message. En revanche il manque ce point pour la deuxième ligne d'en-tête !
En fait, ce qui cloche c'est plutôt une incohérence entre l'en-tête et le message : le \n ne doit pas être utilisé pour passer à la ligne car le Content-type est text/html, on doit donc utiliser l'élément <br />.
Justement, comme le type de la page mail est text/html, tu dois composer le message comme une page Web avec toutes ses balises et le doctype.
Voici à quoi les entêtes doivent être pour que le code html soit bien compris :
En fait, ce qui cloche c'est plutôt une incohérence entre l'en-tête et le message : le \n ne doit pas être utilisé pour passer à la ligne car le Content-type est text/html, on doit donc utiliser l'élément <br />.
Justement, comme le type de la page mail est text/html, tu dois composer le message comme une page Web avec toutes ses balises et le doctype.
Voici à quoi les entêtes doivent être pour que le code html soit bien compris :
$entete ='MIME-Version: 1.0'."\r\n"; $entete .= 'Content-type: text/html; charset=utf-8'."\r\n"; $entete .= 'From: '.$nom."\r\n".'Reply-To: '.$email."\r\n";
En fait moi aussi avec le formulaire sur mon site je reçois le message avec des antislashs devant les guillemets simples et doubles, et des espaces à la place des retours à la ligne, mais je n'ai jamais de
ou autres entités qui se baladent. Aussi, mon code est différent :
-> Je n'utilise pas htmlentities() qui convertit tout en entités, même ce qu'il n'est pas nécessaire de convertir (caractères compréhensibles directement avec l'encodage indiqué : lettres accentuées, signe euro, dièse...). Je n'utilise que htmlspecialchars() même avec le message. Avec cette modification, les entités html ne devraient pas s'afficher dans le mail mais bien les caractères qui correspondent.
-> Je n'utilise pas addslashes(). Je viens de consulter la page sur cette fonction :
http://php.net/manual/fr/function.addslashes.php
Elle permet d'éviter les conflits entre php et html en ajoutant les antislashs d'échappement, antislashs qui se retrouvent au final dans le message du mail...
Même en enlevant cette fonction, cela ne résoudra pas le problème, puisque les antislashs sont ajoutés (je les ai alors que je n'utilise pas addslashes()).
Par contre, il semble qu'une autre fonction listée dans la suite de la page de la fonction addslashes() dans la section 'Voir aussi' pourrait nous intéresser : la fonction stripslashes() supprime les antislashs d'une chaîne, ce qui pourrait éviter l'apparition d'antislashs dans le mail final.
Il faudrait tester cette fonction, la solution est peut-être là
http://www.php.net/manual/fr/function.stripslashes.php
'
ou autres entités qui se baladent. Aussi, mon code est différent :
-> Je n'utilise pas htmlentities() qui convertit tout en entités, même ce qu'il n'est pas nécessaire de convertir (caractères compréhensibles directement avec l'encodage indiqué : lettres accentuées, signe euro, dièse...). Je n'utilise que htmlspecialchars() même avec le message. Avec cette modification, les entités html ne devraient pas s'afficher dans le mail mais bien les caractères qui correspondent.
-> Je n'utilise pas addslashes(). Je viens de consulter la page sur cette fonction :
http://php.net/manual/fr/function.addslashes.php
Elle permet d'éviter les conflits entre php et html en ajoutant les antislashs d'échappement, antislashs qui se retrouvent au final dans le message du mail...
Même en enlevant cette fonction, cela ne résoudra pas le problème, puisque les antislashs sont ajoutés (je les ai alors que je n'utilise pas addslashes()).
Par contre, il semble qu'une autre fonction listée dans la suite de la page de la fonction addslashes() dans la section 'Voir aussi' pourrait nous intéresser : la fonction stripslashes() supprime les antislashs d'une chaîne, ce qui pourrait éviter l'apparition d'antislashs dans le mail final.
Il faudrait tester cette fonction, la solution est peut-être là
http://www.php.net/manual/fr/function.stripslashes.php
Un immense merci !!!! Ça fonctionne parfaitement bien =)
J'ai tester en utilisant des simples et doubles quotes. Mon message apparaît correctement, sans antislashes.
Par contre un probème subsiste :
Si dans mon message du formulaire j'utilise des accents, le message obtenus dans ma boite mail est vide... c'est à dire, que j'ai bien le nom, prénom, email de la personne qui a écris, mais pas son message perso...
Encore merci !!
J'ai tester en utilisant des simples et doubles quotes. Mon message apparaît correctement, sans antislashes.
Par contre un probème subsiste :
Si dans mon message du formulaire j'utilise des accents, le message obtenus dans ma boite mail est vide... c'est à dire, que j'ai bien le nom, prénom, email de la personne qui a écris, mais pas son message perso...
Encore merci !!
Désolé d'être chiant, mais je constate un autre problème depuis pas mal de temps. Dans mon fichier PHP, je définis l'adresse à laquelle le mail doit s'envoyer. Si je met mon adresse hotmail, aucun problème je reçois le mail. Par contre avec mon adresse principale qqch@wanadoo.fr je ne reçois aucun mail. Pourtant j'ai vérifier la syntaxe de mon adresse, c'est la bonne.
$message = htmlentities($message, ENT_QUOTES, "UTF-8"); $message = "Vous venez de recevoir un nouveau message...
Je trouve bizarre de réaffecter $message, la première ligne ne sert à rien dans ce cas.
Je pense que le problème vient de là, il te manque le point pour le concatener à la première partie du $message :
$message = htmlentities($message, ENT_QUOTES, "UTF-8"); $message .= "Vous venez de recevoir un nouveau message...
Merci à tous, mon message s'envoie correctement, c'est parfait !!
Cependant un problème subsiste. En testant l'envoi d'un message contenant volontairement des apostrophes et des doubles guillemets, je reçois un mail incompréhensible car rempli d'anti-slashes, de " ou encore de #&039
Comment faire pour obtenir un mail normal pouvant contenir des caractères comme l'apostrophe ou les guillemets ?
Voici mon nouveau code PHP :
Merci d'avance
Nicolas
Cependant un problème subsiste. En testant l'envoi d'un message contenant volontairement des apostrophes et des doubles guillemets, je reçois un mail incompréhensible car rempli d'anti-slashes, de " ou encore de #&039
Comment faire pour obtenir un mail normal pouvant contenir des caractères comme l'apostrophe ou les guillemets ?
Voici mon nouveau code PHP :
<?php $erreur = NULL; $info = NULL; if(!empty($_POST['nom']) && !empty($_POST['prenom']) && !empty($_POST['email']) && !empty($_POST['message'])) { extract($_POST); if($_POST['RadioGroup1'] == 'webmaster') { if(preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#",$email)) { $nom = htmlspecialchars(addslashes($nom)); $prenom = htmlspecialchars(addslashes($prenom)); $email = htmlspecialchars(addslashes($email)); $destinataire = "test@hotmail.com"; $sujet = "Formulaire de contact"; $entete ='MIME-Version: 1.0'."\r\n"; $entete .= 'Content-type: text/html; charset=utf-8'."\r\n"; $entete .= 'From: '.$nom."\r\n".'Reply-To: '.$email."\r\n"; $message = htmlentities($message, ENT_QUOTES, "UTF-8"); $message .= htmlspecialchars(addslashes($message)); $message = "Vous venez de recevoir un nouveau message en provenance du site www.alsatiadrusenheim.fr <br /> Nom : $nom <br /> Prenom : $prenom <br /> Email : $email <br /> Message : $message"; mail($destinataire, $sujet, $message, $entete); $info = "Votre message a bien été envoyé."; unset($_POST, $message, $nom, $prenom, $email); } else { $erreur="Adresse e-mail invalide"; } } ...
Merci d'avance
Nicolas
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
$nom = htmlspecialchars(addslashes($nom));
normal que tu ai des / c'est toi qui les rajoutes par la fonction addslashes
supprimes cette fonction partout
et si tu envoies un message au format text/html il faudrait peut être bien mettre
<html>
</html>
dans le corps de ton mail c'est a dire au début et à la fin de $message
normal que tu ai des / c'est toi qui les rajoutes par la fonction addslashes
supprimes cette fonction partout
et si tu envoies un message au format text/html il faudrait peut être bien mettre
<html>
</html>
dans le corps de ton mail c'est a dire au début et à la fin de $message
En effet, à mon avis tu devrais aller voir du côté de l'antispam, les e-mails envoyés avec la fonction mail() depuis les sites internet sont considérés comme SPAM par la plupart des anti-spams, donc le mail à mon avis a bien été envoyé mais le client de messagerie l'a supprimé pensant que c'était un spam. Pour corriger ce problème, mets l'adresse mail d'envoi du site dans la liste verte ou blanche (selon l'antispam).
Le problème des accents dans mon code ne se pose que dans l'objet listé dans la boîte de réception car la page 'boîte de réception' n'est pas encodée en UTF-8, je ne peux rien y faire, en revanche les accents apparaissent correctement quand je lis le message (et c'est normal parce que je spécifie l'encodage dans une balise meta).
Il faut bien comprendre que l'e-mail avec le content-type text/html est une page web entière que le client de messagerie affiche dans un cadre (frame).
Remplace ceci :
par ça :
L'e-mail EST une page Web !
Le problème des accents dans mon code ne se pose que dans l'objet listé dans la boîte de réception car la page 'boîte de réception' n'est pas encodée en UTF-8, je ne peux rien y faire, en revanche les accents apparaissent correctement quand je lis le message (et c'est normal parce que je spécifie l'encodage dans une balise meta).
Il faut bien comprendre que l'e-mail avec le content-type text/html est une page web entière que le client de messagerie affiche dans un cadre (frame).
Remplace ceci :
$message = "Vous venez de recevoir un nouveau message en provenance du site www.alsatiadrusenheim.fr <br /> Nom : $nom <br /> Prenom : $prenom <br /> Email : $email <br /> Message : $message";
par ça :
$message = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> </head> <body> <div>Vous venez de recevoir un nouveau message en provenance du site www.alsatiadrusenheim.fr <br /> Nom : '.$nom.' <br /> Prenom : '.$prenom.' <br /> Email : '.$email.' <br /> Message : '.$message.' </div> </body> </html>';
L'e-mail EST une page Web !
Tu peux même t'amuser à mettre des couleurs, à changer les styles des caractères avec du CSS (ajouter les règles dans une balise
<style type="text/css">/*Règles de style*/</style>placée avant </head>) incorporé (pas de fichiers liés, le mail est un seul fichier), comme dans les newsletters des grands sites, mais sans images ! (je ne sais pas encore joindre en php des fichiers à un mail)
Merci beaucoup pour ta réponse, cependant rien n'y fait... Toujours pas de message qui s'affiche quand j'utilise des accents :s
J'ai ensuite modifié légèrement mon code en supprimant le "UTF-8 à la fin de cette ligne :
$message = stripslashes(htmlspecialchars($message, ENT_QUOTES, "UTF-8"));
devient :
$message = stripslashes(htmlspecialchars($message, ENT_QUOTES));
et j'ai supprimé la ligne :
$message = htmlentities($message, ENT_QUOTES, "UTF-8");
Maintenant quand j'écris un mail contenant des accents, mon message s'afifche !! Mais les caractères accentués sont remplacés par un losange noir contenant un point d'interrogation blanc.
J'ai ensuite modifié légèrement mon code en supprimant le "UTF-8 à la fin de cette ligne :
$message = stripslashes(htmlspecialchars($message, ENT_QUOTES, "UTF-8"));
devient :
$message = stripslashes(htmlspecialchars($message, ENT_QUOTES));
et j'ai supprimé la ligne :
$message = htmlentities($message, ENT_QUOTES, "UTF-8");
Maintenant quand j'écris un mail contenant des accents, mon message s'afifche !! Mais les caractères accentués sont remplacés par un losange noir contenant un point d'interrogation blanc.
Je suis d'accord avec Alain_42, la fonction addslashes() est inutile ici, ce n'est pas la peine d'ajouter des antislashs, il sont ajoutés automatiquement, enlève cette fonction partout.
Autre truc qui cloche et qui pourrait mettre le mail en courrier indésirable par les boîtes de messagerie :
Il y a un problème ici : tu ne mets pas l'adresse de messagerie depuis laquelle tu envoies le mail.
La syntaxe est pour le from :
Donc en fait :
Bien evidemment, remplace adresseemailsite par la bonne adresse.
Connecte-toi sur le site de l'hébergeur et crée une adresse mail sur ton site, c'est cette adresse qu'il faut mettre entre crochets angulaires
La précision est le fruit de la réussite.
Autre truc qui cloche et qui pourrait mettre le mail en courrier indésirable par les boîtes de messagerie :
$entete .= 'From: '.$nom."\r\n"
Il y a un problème ici : tu ne mets pas l'adresse de messagerie depuis laquelle tu envoies le mail.
La syntaxe est pour le from :
From: nom <adresseemailsite@alsatiadrusenheim.fr>
Donc en fait :
$entete .= 'From: '.$nom."<adresseemailsite@alsatiadrusenheim.fr>\r\n"etc. (la suite Reply-To est bien, ne change pas).
Bien evidemment, remplace adresseemailsite par la bonne adresse.
Connecte-toi sur le site de l'hébergeur et crée une adresse mail sur ton site, c'est cette adresse qu'il faut mettre entre crochets angulaires
La précision est le fruit de la réussite.
Les losanges noirs signifient que l'encodage de la page est différent de celui dans lequel le navigateur affiche la page. D'ailleurs, essaie de modifier l'encodage quand tu consultes le mail :
Dans Firefox,
Menu Affichage -> Encodage des caractères -> Unicode (UTF-8)
Et voilà, l'e-mail s'affiche correctement !
Bon, alors là, il y a un truc qui m'échappe : normalement le navigateur DOIT employer directement l'encodage utf-8 car on l'a spécifié ici :
J'ai une adresse hotmail, j'ai fait mes tests avec, et ça marche !
Donc je ne vois pas ce qui pèche, ou bien l'encodage de la page hotmail prend le dessus. Windows Live Hotmail a subi récemment une mise à jour et peut-être que ça ne marche plus, mais ce n'est pas normal, une bonne messagerie sait reconnaître l'encodage.
Ou bien il y a un autre problème : vérifie que le fichier php où est écrit le code est bien encodé en utf-8, sinon ça ne marchera pas. Tu utilises quel éditeur ?
Dans Firefox,
Menu Affichage -> Encodage des caractères -> Unicode (UTF-8)
Et voilà, l'e-mail s'affiche correctement !
Bon, alors là, il y a un truc qui m'échappe : normalement le navigateur DOIT employer directement l'encodage utf-8 car on l'a spécifié ici :
<head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> </head>
J'ai une adresse hotmail, j'ai fait mes tests avec, et ça marche !
Donc je ne vois pas ce qui pèche, ou bien l'encodage de la page hotmail prend le dessus. Windows Live Hotmail a subi récemment une mise à jour et peut-être que ça ne marche plus, mais ce n'est pas normal, une bonne messagerie sait reconnaître l'encodage.
Ou bien il y a un autre problème : vérifie que le fichier php où est écrit le code est bien encodé en utf-8, sinon ça ne marchera pas. Tu utilises quel éditeur ?
OK. Content que ça marche.
PS: en complément de ma remarque ci-dessus : dans Notepad++, dans la barre d'état, l'encodage est indiqué. Ce doit être UTF-8 ou ANSI as UTF-8, qui dépend si le fichier est encodé avec un byte order mark (BOM) ou non. Tu as les commandes pour convertir dans un des menus.
Mais à mon avis Dreamweaver (éditeur de pages web réputé) ne s'est pas trompé d'encodage.
Moi j'utilise Expression Web son concurrent (parce que je l'ai eu gratos, il est offert aux étudiants inscrits sur Dreamspark France).
Bonne continuation sur ton site !
PS: en complément de ma remarque ci-dessus : dans Notepad++, dans la barre d'état, l'encodage est indiqué. Ce doit être UTF-8 ou ANSI as UTF-8, qui dépend si le fichier est encodé avec un byte order mark (BOM) ou non. Tu as les commandes pour convertir dans un des menus.
Mais à mon avis Dreamweaver (éditeur de pages web réputé) ne s'est pas trompé d'encodage.
Moi j'utilise Expression Web son concurrent (parce que je l'ai eu gratos, il est offert aux étudiants inscrits sur Dreamspark France).
Bonne continuation sur ton site !
Utiliser des guillemets simples pour la composition de ton message est un atout, sinon les guillemets des attributs de balise vont poser problème, il va falloir rajouter des caractères d'échappement (anti-slash) partout, et c'est d'un casse-tête épouvantable.
Exemple :
C'est quand même beaucoup plus pratique comme ça :