bonjour,
j'ai récupéré un script permettant l'envoi de message vers ma boite
mail suite a un formulaire mais franchement je le trouve pas très bien
fichu... J'aurais aimé que quelqu'un puisse me corriger les petites
fautes "gout", par exemple:
plutôt que d'afficher une nouvelle page pour confirmer l'envoi ou
noter une erreur dans le formulaire (ou un champ non rempli, que ce
soit un message qui affiche l'information désiré. Ceci éviterai aussi
que la personne ai à re-remplir le formulaire en entier si un erreur
survenait... bref, arranger un peu ce script!
merci d'avance pour votre aide!
********************************************************************************************
*/
// destinataire est votre adresse mail. Pour envoyer à plusieurs à la
fois, séparez-les par une virgule
$destinataire = 'adresse email';
// copie ? (envoie une copie au visiteur)
$copie = 'non'; // 'oui' ou 'non'
// Messages de confirmation du mail
$message_envoye = "Votre message a bien été
envoyé !";
$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.html\">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;
};
// 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 != '') && ($objet != '') && ($message !''))
{
// les 4 variables sont remplies, on génère puis envoie le mail
$headers = 'From: '.$nom.' <'.$email.'>' . "\r\n";
// envoyer une copie au visiteur ?
if ($copie == 'oui')
{
$cible = $destinataire.','.$email;
}
else
{
$cible = $destinataire;
};
// Envoi du mail
if (mail($cible, $objet, $message, $headers))
{
echo '<p>'.$message_envoye.'</p>'."\n";
}
else
{
echo '<p>'.$message_non_envoye.'</p>'."\n";
};
}
else
{
// une des 3 variables (ou plus) est vide ...
echo '<p>'.$message_formulaire_invalide.' <a
href="contact.html">Retour au formulaire</a></p>'."\n";
};
}; // fin du if (!isset($_POST['envoi']))
?>
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Olivier Miakinen
Bonjour,
Le 26/09/2009 11:53, cirion a écrit :
j'ai récupéré un script permettant l'envoi de message vers ma boite mail suite a un formulaire mais franchement je le trouve pas très bien fichu... J'aurais aimé que quelqu'un puisse me corriger les petites fautes "gout", par exemple: plutôt que d'afficher une nouvelle page pour confirmer l'envoi ou noter une erreur dans le formulaire (ou un champ non rempli, que ce soit un message qui affiche l'information désiré. Ceci éviterai aussi que la personne ai à re-remplir le formulaire en entier si un erreur survenait... bref, arranger un peu ce script!
Je vais jeter un coup d'½il, mais n'attends pas des miracles car je ne fais pas tellement ce genre de choses.
[...] $message_envoye = "Votre message a bien été envoyé !"; [...] $message_formulaire_invalide = "Vérifiez que [...]";
À partir du moment où tu as ne serait-ce qu'un seul caractère non ascii (le « é » de « vérifier »), tu es obligé de préciser le charset comme il faut, et du coup du peux te dispenser de tous les « é » qui se trouvent ailleurs dans cette page. Ce sera beaucoup plus lisible.
[...] // on teste si le formulaire a été soumis if (!isset($_POST['envoi'])) {
Je ne sais pas quelle est la logique exacte de ce champ 'envoi' qui est testé uniquement pour savoir s'il est présent ou pas. En principe, j'imagine qu'on teste plutôt les champs utiles ('nom', 'email', etc.) et qu'on continue de présenter la page jusqu'à ce que tous les champs obligatoires soient remplis.
// formulaire non envoyé echo '<p>'.$message_erreur_formulaire.'</p>'."n";
Juste une remarque d'ordre esthétique, mais tu as tout à fait le droit de ne pas être d'accord avec moi : personnellement je préfère écrire echo "<p>$message_erreur_formulaire</p>n"; que je trouve plus concis. Cela dit, il y a de farouches opposants à cette façon de faire car ils trouvent que c'est moins lisible ou qu'il est plus facile de faire des erreurs avec ça.
/* * 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;
AAAARGH !
S'il y a *un* point sur lequel tu dois changer quelque chose, c'est bien la regexp de validation des adresses e-mail. Note que je ne suis pas surpris : je pense que plus de 95 % des regexp proposées ici ou là pour cette vérification sont erronées, refusant un particulier certaines longueurs de TLD (domaine de premier niveau) et surtout interdisant le caractère « + » dans la partie gauche alors qu'il est si utile !
Je passerai sur la façon bizarre d'écrire ([a-z0-9_]|-|.) au lieu de [.a-z0-9_-] et je te conseille juste de lire le chapitre correspondant dans la FAQ de ce groupe : <http://faqfclphp.free.fr/#rub5.3> (tu peux te dispenser de tout le laïus, et ne garder que la regexp qui te plaît parmi celles proposées).
};
Ah, tiens, je n'avais pas vu que tu faisais suivre la plupart de tes accolades fermantes d'un point-virgule. C'est parfaitement inutile (et même nuisible si jamais tu en laissais traîner un par erreur avant un « else » dans des structures if imbriquées).
// 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é
Tu souhaites (et tu as 100 % raison) que l'utilisateur n'ait pas à ressaisir les champs du formulaire lorsqu'il fait une erreur. Ceci vaut pour l'adresse de courriel : ainsi, lorsque tu réaffiches le formulaire, tu devras utiliser Rec($_POST['email']) plutôt que $email si tu l'as écrasé comme ci-dessus.
En effet, si l'utilisateur a tapé par erreur om+newsàmiakinen.net, c'est sympa de lui laisser ce texte où il n'a plus qu'à remplacer « à » par « @ » plutôt que le forcer à tout retaper.
if (($nom != '') && ($email != '') && ($objet != '') && ($message !'')) { // les 4 variables sont remplies, on génère puis envoie le mail $headers = 'From: '.$nom.' <'.$email.'>' . "rn";
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGH !!!!
Ne JAMAIS mettre dans les entêtes d'un courriel généré automatiquement des données non vérifiées qui viennent de l'extérieur ! Grâce à ton formulaire, un spammeur peut te faire envoyer des spams pour n'importe quel produit, à raison de plusieurs milliers de destinataires par requête http.
Donc : $headers = "From: cirion n";
$msg = "Message envoyé par $nom <$email>n"; $msg .= "L'objet est $objetn"; $msg .= "Contenu du message :n"; $msg .= $message; ... mail("", "formulaire web", $msg, $headers);
// envoyer une copie au visiteur ? if ($copie == 'oui') { $cible = $destinataire.','.$email;
Oui, éventuellement, étant entendu que $destinataire est codé en dur dans le code, et que $email a été vérifié comme portant une et une seule adresse de courriel. Il serait bien aussi d'avoir un test qui évite les rafales d'envois, toujours pour éviter le spam ou du moins le flood.
Ah tiens, c'est vrai, tu as fait un htmlspecialchars plus haut, je viens seulement de le voir. Bon, eh bien je pense que c'était une mauvaise idée : il vaudrait mieux ne le faire qu'au moment de l'affichage, ce qui t'évite d'avoir à faire tous ces str_replace ici (surtout si le charset de ta page est UTF-8).
// une des 3 variables (ou plus) est vide ... echo '<p>'.$message_formulaire_invalide.' <a href="contact.html">Retour au formulaire</a></p>'."n";
Ah, si je comprends bien c'est ici qu'est la principale raison pour laquelle l'utilisateur doit tout retaper en cas d'erreur de saisie : c'est parce que tu lui imposes de cliquer sur un lien alors que ça devrait être le même script qui affiche et traite le formulaire.
En gros, ta page devrait ressembler à ceci :
tester $_REQUEST['nom'], $_REQUEST['email'], etc. si OK { envoyer le courriel } sinon { <p>Le formulaire est incomplet</p> <form ...> <input ... $_REQUEST['nom'] ...> <input ... $_REQUEST['email'] ...> ... </form> }
Cordialement, -- Olivier Miakinen
Bonjour,
Le 26/09/2009 11:53, cirion a écrit :
j'ai récupéré un script permettant l'envoi de message vers ma boite
mail suite a un formulaire mais franchement je le trouve pas très bien
fichu... J'aurais aimé que quelqu'un puisse me corriger les petites
fautes "gout", par exemple:
plutôt que d'afficher une nouvelle page pour confirmer l'envoi ou
noter une erreur dans le formulaire (ou un champ non rempli, que ce
soit un message qui affiche l'information désiré. Ceci éviterai aussi
que la personne ai à re-remplir le formulaire en entier si un erreur
survenait... bref, arranger un peu ce script!
Je vais jeter un coup d'½il, mais n'attends pas des miracles car je ne
fais pas tellement ce genre de choses.
[...]
$message_envoye = "Votre message a bien été envoyé !";
[...]
$message_formulaire_invalide = "Vérifiez que [...]";
À partir du moment où tu as ne serait-ce qu'un seul caractère non ascii
(le « é » de « vérifier »), tu es obligé de préciser le charset comme il
faut, et du coup du peux te dispenser de tous les « é » qui se
trouvent ailleurs dans cette page. Ce sera beaucoup plus lisible.
[...]
// on teste si le formulaire a été soumis
if (!isset($_POST['envoi']))
{
Je ne sais pas quelle est la logique exacte de ce champ 'envoi' qui est
testé uniquement pour savoir s'il est présent ou pas. En principe,
j'imagine qu'on teste plutôt les champs utiles ('nom', 'email', etc.)
et qu'on continue de présenter la page jusqu'à ce que tous les champs
obligatoires soient remplis.
// formulaire non envoyé
echo '<p>'.$message_erreur_formulaire.'</p>'."n";
Juste une remarque d'ordre esthétique, mais tu as tout à fait le droit
de ne pas être d'accord avec moi : personnellement je préfère écrire
echo "<p>$message_erreur_formulaire</p>n";
que je trouve plus concis. Cela dit, il y a de farouches opposants à
cette façon de faire car ils trouvent que c'est moins lisible ou qu'il
est plus facile de faire des erreurs avec ça.
/*
* 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;
AAAARGH !
S'il y a *un* point sur lequel tu dois changer quelque chose, c'est bien
la regexp de validation des adresses e-mail. Note que je ne suis pas
surpris : je pense que plus de 95 % des regexp proposées ici ou là pour
cette vérification sont erronées, refusant un particulier certaines
longueurs de TLD (domaine de premier niveau) et surtout interdisant le
caractère « + » dans la partie gauche alors qu'il est si utile !
Je passerai sur la façon bizarre d'écrire ([a-z0-9_]|\-|\.) au lieu de
[.a-z0-9_-] et je te conseille juste de lire le chapitre correspondant
dans la FAQ de ce groupe : <http://faqfclphp.free.fr/#rub5.3> (tu peux
te dispenser de tout le laïus, et ne garder que la regexp qui te plaît
parmi celles proposées).
};
Ah, tiens, je n'avais pas vu que tu faisais suivre la plupart de tes
accolades fermantes d'un point-virgule. C'est parfaitement inutile (et
même nuisible si jamais tu en laissais traîner un par erreur avant un
« else » dans des structures if imbriquées).
// 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é
Tu souhaites (et tu as 100 % raison) que l'utilisateur n'ait pas à
ressaisir les champs du formulaire lorsqu'il fait une erreur. Ceci vaut
pour l'adresse de courriel : ainsi, lorsque tu réaffiches le formulaire,
tu devras utiliser Rec($_POST['email']) plutôt que $email si tu l'as
écrasé comme ci-dessus.
En effet, si l'utilisateur a tapé par erreur om+newsàmiakinen.net, c'est
sympa de lui laisser ce texte où il n'a plus qu'à remplacer « à » par
« @ » plutôt que le forcer à tout retaper.
if (($nom != '') && ($email != '') && ($objet != '') && ($message !''))
{
// les 4 variables sont remplies, on génère puis envoie le mail
$headers = 'From: '.$nom.' <'.$email.'>' . "rn";
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGH !!!!
Ne JAMAIS mettre dans les entêtes d'un courriel généré automatiquement
des données non vérifiées qui viennent de l'extérieur ! Grâce à ton
formulaire, un spammeur peut te faire envoyer des spams pour n'importe
quel produit, à raison de plusieurs milliers de destinataires par
requête http.
Donc :
$headers = "From: cirion <cirion@example.com>n";
$msg = "Message envoyé par $nom <$email>n";
$msg .= "L'objet est $objetn";
$msg .= "Contenu du message :n";
$msg .= $message;
...
mail("cirion@example.com", "formulaire web", $msg, $headers);
// envoyer une copie au visiteur ?
if ($copie == 'oui')
{
$cible = $destinataire.','.$email;
Oui, éventuellement, étant entendu que $destinataire est codé en dur
dans le code, et que $email a été vérifié comme portant une et une seule
adresse de courriel. Il serait bien aussi d'avoir un test qui évite les
rafales d'envois, toujours pour éviter le spam ou du moins le flood.
Ah tiens, c'est vrai, tu as fait un htmlspecialchars plus haut, je viens
seulement de le voir. Bon, eh bien je pense que c'était une mauvaise
idée : il vaudrait mieux ne le faire qu'au moment de l'affichage, ce qui
t'évite d'avoir à faire tous ces str_replace ici (surtout si le charset
de ta page est UTF-8).
// une des 3 variables (ou plus) est vide ...
echo '<p>'.$message_formulaire_invalide.' <a
href="contact.html">Retour au formulaire</a></p>'."n";
Ah, si je comprends bien c'est ici qu'est la principale raison pour
laquelle l'utilisateur doit tout retaper en cas d'erreur de saisie :
c'est parce que tu lui imposes de cliquer sur un lien alors que ça
devrait être le même script qui affiche et traite le formulaire.
En gros, ta page devrait ressembler à ceci :
tester $_REQUEST['nom'], $_REQUEST['email'], etc.
si OK {
envoyer le courriel
} sinon {
<p>Le formulaire est incomplet</p>
<form ...>
<input ... $_REQUEST['nom'] ...>
<input ... $_REQUEST['email'] ...>
...
</form>
}
j'ai récupéré un script permettant l'envoi de message vers ma boite mail suite a un formulaire mais franchement je le trouve pas très bien fichu... J'aurais aimé que quelqu'un puisse me corriger les petites fautes "gout", par exemple: plutôt que d'afficher une nouvelle page pour confirmer l'envoi ou noter une erreur dans le formulaire (ou un champ non rempli, que ce soit un message qui affiche l'information désiré. Ceci éviterai aussi que la personne ai à re-remplir le formulaire en entier si un erreur survenait... bref, arranger un peu ce script!
Je vais jeter un coup d'½il, mais n'attends pas des miracles car je ne fais pas tellement ce genre de choses.
[...] $message_envoye = "Votre message a bien été envoyé !"; [...] $message_formulaire_invalide = "Vérifiez que [...]";
À partir du moment où tu as ne serait-ce qu'un seul caractère non ascii (le « é » de « vérifier »), tu es obligé de préciser le charset comme il faut, et du coup du peux te dispenser de tous les « é » qui se trouvent ailleurs dans cette page. Ce sera beaucoup plus lisible.
[...] // on teste si le formulaire a été soumis if (!isset($_POST['envoi'])) {
Je ne sais pas quelle est la logique exacte de ce champ 'envoi' qui est testé uniquement pour savoir s'il est présent ou pas. En principe, j'imagine qu'on teste plutôt les champs utiles ('nom', 'email', etc.) et qu'on continue de présenter la page jusqu'à ce que tous les champs obligatoires soient remplis.
// formulaire non envoyé echo '<p>'.$message_erreur_formulaire.'</p>'."n";
Juste une remarque d'ordre esthétique, mais tu as tout à fait le droit de ne pas être d'accord avec moi : personnellement je préfère écrire echo "<p>$message_erreur_formulaire</p>n"; que je trouve plus concis. Cela dit, il y a de farouches opposants à cette façon de faire car ils trouvent que c'est moins lisible ou qu'il est plus facile de faire des erreurs avec ça.
/* * 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;
AAAARGH !
S'il y a *un* point sur lequel tu dois changer quelque chose, c'est bien la regexp de validation des adresses e-mail. Note que je ne suis pas surpris : je pense que plus de 95 % des regexp proposées ici ou là pour cette vérification sont erronées, refusant un particulier certaines longueurs de TLD (domaine de premier niveau) et surtout interdisant le caractère « + » dans la partie gauche alors qu'il est si utile !
Je passerai sur la façon bizarre d'écrire ([a-z0-9_]|-|.) au lieu de [.a-z0-9_-] et je te conseille juste de lire le chapitre correspondant dans la FAQ de ce groupe : <http://faqfclphp.free.fr/#rub5.3> (tu peux te dispenser de tout le laïus, et ne garder que la regexp qui te plaît parmi celles proposées).
};
Ah, tiens, je n'avais pas vu que tu faisais suivre la plupart de tes accolades fermantes d'un point-virgule. C'est parfaitement inutile (et même nuisible si jamais tu en laissais traîner un par erreur avant un « else » dans des structures if imbriquées).
// 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é
Tu souhaites (et tu as 100 % raison) que l'utilisateur n'ait pas à ressaisir les champs du formulaire lorsqu'il fait une erreur. Ceci vaut pour l'adresse de courriel : ainsi, lorsque tu réaffiches le formulaire, tu devras utiliser Rec($_POST['email']) plutôt que $email si tu l'as écrasé comme ci-dessus.
En effet, si l'utilisateur a tapé par erreur om+newsàmiakinen.net, c'est sympa de lui laisser ce texte où il n'a plus qu'à remplacer « à » par « @ » plutôt que le forcer à tout retaper.
if (($nom != '') && ($email != '') && ($objet != '') && ($message !'')) { // les 4 variables sont remplies, on génère puis envoie le mail $headers = 'From: '.$nom.' <'.$email.'>' . "rn";
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGH !!!!
Ne JAMAIS mettre dans les entêtes d'un courriel généré automatiquement des données non vérifiées qui viennent de l'extérieur ! Grâce à ton formulaire, un spammeur peut te faire envoyer des spams pour n'importe quel produit, à raison de plusieurs milliers de destinataires par requête http.
Donc : $headers = "From: cirion n";
$msg = "Message envoyé par $nom <$email>n"; $msg .= "L'objet est $objetn"; $msg .= "Contenu du message :n"; $msg .= $message; ... mail("", "formulaire web", $msg, $headers);
// envoyer une copie au visiteur ? if ($copie == 'oui') { $cible = $destinataire.','.$email;
Oui, éventuellement, étant entendu que $destinataire est codé en dur dans le code, et que $email a été vérifié comme portant une et une seule adresse de courriel. Il serait bien aussi d'avoir un test qui évite les rafales d'envois, toujours pour éviter le spam ou du moins le flood.
Ah tiens, c'est vrai, tu as fait un htmlspecialchars plus haut, je viens seulement de le voir. Bon, eh bien je pense que c'était une mauvaise idée : il vaudrait mieux ne le faire qu'au moment de l'affichage, ce qui t'évite d'avoir à faire tous ces str_replace ici (surtout si le charset de ta page est UTF-8).
// une des 3 variables (ou plus) est vide ... echo '<p>'.$message_formulaire_invalide.' <a href="contact.html">Retour au formulaire</a></p>'."n";
Ah, si je comprends bien c'est ici qu'est la principale raison pour laquelle l'utilisateur doit tout retaper en cas d'erreur de saisie : c'est parce que tu lui imposes de cliquer sur un lien alors que ça devrait être le même script qui affiche et traite le formulaire.
En gros, ta page devrait ressembler à ceci :
tester $_REQUEST['nom'], $_REQUEST['email'], etc. si OK { envoyer le courriel } sinon { <p>Le formulaire est incomplet</p> <form ...> <input ... $_REQUEST['nom'] ...> <input ... $_REQUEST['email'] ...> ... </form> }