Formulaire de choix multi-contact valide xhtml 1.0 transitional

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

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.