Formulaire de choix multi-contact valide xhtml 1.0 transitional

Soyez le premier à donner votre avis sur cette source.

Vue 12 259 fois - Téléchargée 1 161 fois

Description

C'est mon premier code, je le peaufine depuis plusieurs semaines pour qu'il y ait le moins de choses négatives à dire dessus.

Pas de eregi mais preg_match, valide XHTML 1.0 Transitional!

Formulaire permettant l'envoi d'un mail à une personne parmi une liste prédéfinie dans le script.

Fonctions disponibles : (Liste non exhaustives)
- Test de remplissage,
- vérification de la syntaxe du mail,
- Envoi d'une copie à l'expéditeur,
- Vérification du remplissage des champs,
- Enregistrement des données remplies par le visiteur si une/ erreur(s) est/sont détectée(s),
- ...

Script valide à 100% XHTML 1.0 Transitional !

--------
09/08/2011 : Vu toutes les modifications apportées, c'est une version 2 du script

21/06/2012 : J'ai volontairement laissé le formulaire sans captcha pour ceux qui souhaitent intégrer le leur.

Source / Exemple :


<?php
session_start();

/*

Script php pour envoyer un mail à un destinataire choisi par l'expéditeur LE FORMULAIRE Auteur : aventurier19 version 2.3
  • /
echo '<!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 http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Envoyer un mail</title> </head> <body> <div>Envoyer un mail<br /><br /> <table border="0" cellspacing="0" cellpadding="0" style="width: 719px; border-collapse: collapse"> <tr style="height: 35.25pt"> <td>'; $error_formulaire = false; // sert pour remplir le formulaire en cas d'erreur si besoin $error_code = false; // sert pour afficher éventuellement l'erreur de captcha /*
CONFIGURATION (1ère partie)
  • /
// Mise en variable des destinataires ($destinataireXX = "mail@domaine.fr"; $destXX = "nom du destinataire XX") // Problème de reception avec les adresses du type @hotmail.com @hotmail.fr ou @live.fr // Si vous avez un/des caractère(s) spécial(aux) à mettre dans le prénom et/ou le nom, mettez le caractère ascii du/des caractère(s)) spécial(aux) // (exemple : pour afficher Grégory, écrire Grégory ou Gr&#233;gory) // besoin d'aide : http://www.commentcamarche.net/contents/html/htmlcarac.php3 $destinaire1 = "pseudo1@domaine.fr"; $dest1 = "Pr&#233;nom1 NOM1"; $destinaire2 = "pseudo2@domaine.fr"; $dest2 = "Prénom2 NOM2"; $destinaire3 = "pseudo3@domaine.fr"; $dest3 = "Prenom3 NOM3"; $destinaire4 = "pseudo4@domaine.fr"; $dest4 = "Prénom4 NOM4"; // copie ? (envoie une copie au visiteur) $copie = isset($_POST['copie']) ? $_POST['copie'] : 'non'; //mettre le choix par défaut (oui = case cochée) // Action du formulaire (si votre page a des paramètres dans l'URL) // si cette page est index.php?page=contact alors mettez index.php?page=contact // sinon, laissez vide $form_action = ''; /*
FIN DE LA CONFIGURATION (1ère partie)
  • /
/* 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;'); } // Citation magiques ? $text = $stripslashes($text); $text = htmlspecialchars($text, ENT_QUOTES); // convertion en chaîne avec " et ' aussi $text = nl2br($text); return $text; } /* Cette fonction sert à vérifier la syntaxe d'un email saisi */ function IsEmail($email) { $pattern = "/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/"; return (preg_match($pattern,$email)) ? true : false; } // si formulaire envoyé, on récupère tous les champs. Sinon, on initialise les variables. $nom = (isset($_POST['nom'])) ? Rec($_POST['nom']) : ""; $prenom = (isset($_POST['prenom'])) ? Rec($_POST['prenom']) : ""; $email = (isset($_POST['email'])) ? Rec($_POST['email']) : ""; $sujet = (isset($_POST['sujet'])) ? Rec($_POST['sujet']) : ""; $message = (isset($_POST['message'])) ? Rec($_POST['message']) : ""; // Vérification du statut du mail $email = (IsEmail($email)) ? $email : ""; // soit l'email est vidé si erroné, soit il vaut l'email entré // Vérification du destinataire et enregistrement du choix fait // Si des destinataires doivent être ajoutés, faites bien attention à la syntaxe else { if ($destinataire ...) {$choix ...} // Modifier également le bloc qui démarre à la ligne 256 if ((isset($_POST['destinataire']))) { $destinataire = stripslashes(htmlentities($_POST['destinataire'])); if ($destinataire == $destinaire1) { $choix = 1; } else { if ($destinataire == $destinaire2) { $choix = 2; } else { if ($destinataire == $destinaire3) { $choix = 3; } else { if ($destinataire == $destinaire4) { $choix = 4; } else $choix = 0; } } } } else { $destinataire = ""; $choix = 0; } /*
CONFIGURATION (2nde partie)
  • /
// Liste des messages d'erreur $error_msg = array(); // intialisation du tableau if ($nom == "") // Test si la chaïne de texte est vide $error_msg[] = "Entrez votre nom svp !"; // Ajout de l'erreur à la liste if ($prenom == "") // Test si la chaïne de texte est vide $error_msg[] = "Entrez votre prénom svp !"; // Ajout de l'erreur à la liste if ($email == "") // Test si la chaïne de texte est vide $error_msg[] = "Entrez votre email svp ! <b><i>S'il n'est pas valide, il sera effacé.</i></b>"; // Ajout de l'erreur à la liste /* Vérifier le destinataire (permet la non-acceptation d'envoi avec le choix 'Faites votre choix...') */ if (isset($_POST['envoi'])) { if(preg_match('#^(([a-z0-9!\#$%&\\\'*+/=?^_`
~-]+)@(([a-z0-9-_]+\.?)*[a-z0-9-_]+)\.[a-z]{2,}$#i',str_replace('&amp;','&',$destinataire))) $error_formulaire = false; elseif ($choix != -1) { $error_msg[] = "Choisissez un destinataire svp!"; // Ajouter à la liste $choix = 0; } } if ($sujet == "") // Test si la chaïne de texte est vide $error_msg[] = "Entrez le sujet de votre message svp !"; // Ajout de l'erreur à la liste if ($message == "") // Test si la chaïne de texte est vide $error_msg[] = "N'oubliez pas d'écrire votre message !"; // Ajout de l'erreur à la liste $error_captcha = "Code de sécurité incorrect !"; // Texte si le captcha est incorrect $error_text = "Ré&eacutecrivez le code de sécurité ci-dessous svp !"; // Texte si le captcha est correct mais pas le remplissage du formulaire /*
FIN DE LA CONFIGURATION
  • /
if (isset($_POST['envoi'])) { // Affichage des éventuels erreurs à cause de champs vide if ($error_msg) { echo "<ul style='color: red; margin-top:0px;'>\n"; // Ouvre la liste foreach ($error_msg as $err) { //Ecrit chaque erreur de la liste echo " <li>".$err."</li>\n"; } echo " </ul>\n"." "; // Ferme la liste $error_formulaire = true; } // Vérification du captcha securimage require_once("securimage/securimage.php"); $securimage = new Securimage(); if ($securimage->check($_POST['captcha_code']) == false) { $error_code = true; $error_formulaire = true; } if (!$error_formulaire) { if (($nom != '') && ($prenom != '') && ($email != '') && ($sujet != '') && ($message != '')) { // les 4 variables sont remplies, on génère puis envoie le mail $headers = 'From: '.$prenom.' '.$nom.' <'.$email.'>'."\nContent-Type: text/html; charset=utf-8\r\nMIME-Version: 1.0"; // envoyer une copie au visiteur ? if ($copie == 'oui') { $cible = $destinataire.','.$email; } else { $cible = $destinataire; } // Envoi du mail if (mail($cible, $sujet, $message, $headers)) { $_SESSION['envoi'] = 1; // validation de la session - message envoyé $_SESSION['copie'] = $copie; // enregistrement du choix de copie pour la page de résultat echo '<script language="Javascript"> document.location.replace("Resultat.php") </script>'."\n"; exit(); } else { $_SESSION['envoi'] = 2; // validation de la session - message non-envoyé echo '<script language= "Javascript"> document.location.replace("Resultat.php") </script>'."\n"; exit(); } } } // fin du if(!$error_formulaire) } //fin du if (isset($_POST['envoi'])) if ($error_formulaire || (!isset($_POST['envoi']))) { // afficher le formulaire echo '<form id="contact" method="post" action="'.$form_action.'"> <fieldset><legend>Vos coordonnées</legend> <table border="0"> <tr> <td align="right" valign="top" width="179">'.'<label for="nom">Nom :</label>'.'</td> <td>'.'<input type="text" id="nom" name="nom" size="69" value="'.stripslashes($nom).'" tabindex="1" />'.'<br />'.'<br />'.'</td> </tr> <tr> <td align="right" valign="top" width="179">'.'<label for="prenom">Prénom :</label>'.'</td> <td>'.'<input type="text" id="prenom" name="prenom" size="69" value="'.stripslashes($prenom).'" tabindex="1" />'.'<br />'.'<br />'.'</td> </tr> <tr> <td align="right" width="179">'.'<label for="email">Email :</label>'.'</td> <td>'.'<input type="text" id="email" name="email" size="69" value="'.stripslashes($email).'" tabindex="2" />'.'<br />'.'</td> </tr> </table> </fieldset> <br />'."\n"; // Listage des différents destinataires possible // Possibilité de mettre autant de destinaire que souhaité mais attention à respecter la mise en forme. ?> <label for="destinataire"> Votre message est adressé à :</label> <select id="destinataire" name="destinataire"> <option<?php if ($choix == 0) { echo (' selected="selected"');} ?>>Faites votre choix...</option> <option value=""></option> <option<?php if ($choix == 1) { echo (' selected="selected"');} echo ' value="'.$destinaire1.'">'.$dest1; ?></option> <option<?php if ($choix == 2) { echo (' selected="selected"');} echo ' value="'.$destinaire2.'">'.$dest2; ?></option> <option<?php if ($choix == 3) { echo (' selected="selected"');} echo ' value="'.$destinaire3.'">'.$dest3; ?></option> <option<?php if ($choix == 4) { echo (' selected="selected"');} echo ' value="'.$destinaire4.'">'.$dest4; ?></option> </select> <?php echo '<br />'.'<br /> <fieldset><legend>Votre message :</legend> <table border="0"> <tr> <td align="right" valign="top" width="179">'.'<label for="sujet">Sujet du message :</label>'.'</td> <td>'.'<input type="text" id="sujet" name="sujet" size="69" value="'.stripslashes($sujet).'" tabindex="3" />'.'<br />'.'<br />'.'</td> </tr> <tr> <td align="right" valign="top" width="179">'.'<label for="message">Message :</label>'.'</td> <td>'.'<textarea id="message" name="message" tabindex="4" cols="69" rows="9">'.stripslashes($message).'</textarea>'.'<br />'.'</td> </tr> </table> </fieldset> <br /> <input type="checkbox" id="copie" name="copie" value="oui" '?><?php if ($copie == "oui") { echo "checked ";} echo '/>Recevoir une copie du message envoyé. <span style="font-size: small;">(Cochez pour accepter)</span>'; ?> <p><img id="captcha" style="border: 1px solid #000; margin-right: 15px" src="securimage/securimage_show.php?sid=<?php echo md5(uniqid()) ?>" alt="Image CAPTCHA" align="left" /> <object type="application/x-shockwave-flash" data="securimage/securimage_play.swf?audio_file=securimage/securimage_play.php&amp;bgColor1=#fff&amp;bgColor2=#fff&amp;iconColor=#777&amp;borderWidth=1&amp;borderColor=#000" height="32" width="32"> <param name="movie" value="securimage/securimage_play.swf?audio_file=securimage/securimage_play.php&amp;bgColor1=#fff&amp;bgColor2=#fff&amp;iconColor=#777&amp;borderWidth=1&amp;borderColor=#000" /> </object> &nbsp; <a tabindex="-1" style="border-style: none;" href="#" title="Changer d'image" onclick="document.getElementById('captcha').src = 'securimage/securimage_show.php?sid=' + Math.random(); this.blur(); return false"><img src="securimage/images/refresh.png" alt="Changer d'image" onclick="this.blur()" align="bottom" height="32px" width="32px" border="0" /></a><br /> <strong>Code* :</strong><?php if ($error_code) { echo "<font style='color:red; '> ".$error_captcha."</font>"; } elseif ($error_formulaire) { echo "<font style='color:red; '> ".$error_text."</font>"; } ?><br /> <input type="text" name="captcha_code" size="12" maxlength="8" /></p> <div style="text-align:center;"><input type="reset" name="" value="Réinitialiser le formulaire !" />&nbsp; &nbsp; &nbsp; <input type="submit" name="envoi" value="Envoyer le formulaire !" /></div> </form> </td> </tr> </table> </div> </body> </html> <?php } ?>

Conclusion :


Ce formulaire fonctionne très bien sur un serveur free.

N'hésitez pas à me dire ce que vous en pensez / le noter et si je peux améliorer encore mon code ; éventuellement commment !

En espérant qu'il devienne utile, à bientôt!

----------
Un problème empêchait l'envoi de mail vers des adresses du type @hotmail.com, @hotmail.fr et @live.fr (normalement maintenant résolu) pour les autres types d'adresse pas de problème.

----------
Le captcha peut être facilement mis à jour en téléchargeant la dernière version à cette adresse : http://www.phpcaptcha.org/download/
Copiez tous les fichiers du dossier de l'archive téléchargée dans le dossier securimage (avec écrasement/remplacement des anciens fichiers) du script utilisé.

Attention : si vous avez personnalisé le fichier securimage_show.php, faites-en une sauvegarde avant !

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

les adresses mails sont en clair dans le code source de la page...
Bonjour aventurier 19

J'ai résolu le problème pour les champs,en ajoutant du code ($msg) et tant que j'y étais j'en ai rajouté quelques uns (des champs) URL ci- dessous

http://colleges.ac-rouen.fr/louisphilippe/Formulairesecur/Formulairetcmeu.php

Merci pour ton travail.
aventurier19
Messages postés
102
Date d'inscription
mercredi 14 novembre 2007
Statut
Membre
Dernière intervention
23 juillet 2013

Bonjour philifour,
Quel(s) champs n'avez-vous pas ?
Vers quel service de messagerie vous avez envoyé un mail (hotmail, orange, laposte, sfr, bouygues, free, ...)
Bonjour,

Le formulaire fonctionne, mais dans le mail de réception, je n'ai pas tous les champs, je n'ai que le message.

Cordialement

Philippe FOURDRINIER
aventurier19
Messages postés
102
Date d'inscription
mercredi 14 novembre 2007
Statut
Membre
Dernière intervention
23 juillet 2013

Pour Ninja83:
Dans le fichier reponse.php, remplace

session_destroy;
par
unset($destinataire, $nom, $prenom, $email, $sujet, $message);

ainsi seules les variables utilisées dans le formulaire seront effacées.
Attention cependant car si suite à ton login, tu définis une/les variable(s) $destinataire, $nom, $prenom, $email, $sujet et/ou $message ; elles seront aussi effacées. Si c'est le cas personnalise le unset(); ci-dessus avec tes contraintes.

@+ et merci d'utiliser mon script.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.