Flux rss

[Webmaster] Un formulaire de contact pour votre site

Bookmark Ajouter aux favoris / Partager
Dernière mise à jour le 5 mai 2008 à 18:10 par Ssylvainsab
Publié par Ssylvainsab
Ce formulaire permet d'avoir une page pour être contacté sur son site, sans utiliser de logiciel de messagerie.
La personne qui vous contacte indique son adresse, l'objet du message et son message (évidemment).


Le code est une version personnalisée et arrangée de :
Site du zéro : "Fonction mail() : Un menu contact pur et dur pour votre site

Il utilise la fonction mail, si cela ne fonctionne pas vérifiez que votre hébergeur ne l'a pas désactivée ou bridée.
L'adresse e-mail du destinataire compte aussi.
(J'avais fait ceci avec free, en indiquant mon adresse free, les messages n'étaient pas envoyés.
En mettant une autre adresse cela fonctionne.).

Il n'est pas sécurisé (=pas de vérification "anti-bots"), à vous de vous débrouiller.
Cependant, toutes les vérifications effectuées devraient stopper certains spammeurs peu évolués ;-)

Si vous voulez le faire vous-même, la meilleure façon est de mettre une question simple, comme "Quelle est l'adresse de cette page", ou "Combien font 2+2 ?".

Un humain comprendra tout a fait, mais pas un robot qui répondra n'importe quoi.
C'est plus facile que de générer une image et de la vérifier (bien que ce système semble néanmoins être le plus efficace contre certains robots évolués).

(Vous pouvez aussi faire évoluer le système, par exemple en stockant une série de questions de ce type et en en générant une de manière aléatoire.)

Cependant, le système anti-spam reste à adapter en fonction de la fréquentation du site et de la fiabilité nécessaire.

Le formulaire


Il est disponible a l'adresse :
http://ssylvainsab.free.fr/autres/ccmfaq/script-contact.txt

Voici le code.

La seule chose à faire est de copier/coller le code et de le placer dans un fichier avec l'extension .php (ou .shtml, .php3, etc...)
Attention, n'oubliez pas d'indiquer votre adresse e-mail a la 3° ligne !
<?php
//Ecrivez votre adresse e-mail entre les guillemets
$destinataire='monadresse@mondomaine';
?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="fr">
<head>
  <title>Contact</title>
  <style type="text/css">
    form#contact{border:2px solid red;width:70%;padding:1em}
    p#msg,p#adr,p#obj{border:2px solid green;margin-right:10%;padding:10px}
    p#msg textarea{border:2px solid blue;height:30em;width:80%}
    p#adr input,p#obj input{border:2px solid blue}
    p.bt{text-align:center}
    p.bt input{border:1px red solid;width:50%}
  </style>
  <meta http-equiv="content-type" content="Content-type:text/html;charset=iso-8859-1">
</head>
<body style="direction: ltr;">
<h1>Contact</h1>
<?php
$Previsualiser='<p class="bt">
<input type="submit" name="previsualiser" tabindex="3" value="Pr&eacute;visualiser"></p>';
$Envoi="\n".'<p class="bt">
<input name="envoi" tabindex="4" value="Envoyer" type="submit"></p>';
if (isset($_POST['message']))
  {
    // La variable $verif va nous permettre d'analyser si la sémantique de l'email est bonne
    $verif='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#';
    //quelques remplacements pour les specialchars
    $message=preg_replace('#(<|>)#', '-', $_POST['message']);
    $message=str_replace('"', "'",$message);
    $message=str_replace('&', 'et',$message);
    $objet=preg_replace('#(<|>)#', '-', $_POST['objet']);
    $objet=str_replace('"', "'",$objet);
    $objet=str_replace('&', 'et',$objet);
    // On assigne et/ou protège nos variables
    $votremail=stripslashes(htmlentities($_POST['votremail']));
    $message=stripslashes(htmlspecialchars($message));
    $objet=stripslashes(htmlspecialchars($objet));
    //input envoi/previsualiser
    $envoi=htmlentities($_POST['envoi']);
    $previsualiser=htmlentities($_POST['previsualiser']);
    //on enlève les espaces
    $votremail=trim($votremail);
    $message=trim($message);
    $objet=trim($objet);

    $apercu_resultat='<p>Aperçu du résultat :</p>';

    /*On vérifie si l'e mail et le message sont pleins, et on agit en fonction.
      (on affiche Apercu du resultat, tel ou tel champ est vide, etc...*/
    //Si ca ne vas pas (mal rempli, mail non valide...)
    if((empty($message))or(empty($objet))or(!preg_match($verif,$votremail)))
      {
        //les 3 champs sont vides
        if(empty($votremail)and(empty($message))and(empty($objet)))
          {
            echo '<p>Tous les champs sont vides.</p>';
            $message='';$votremail='';$objet='';$apercu_resultat='';
          }
        //un des champs est vide
        else
          {
            if(!preg_match($verif,$votremail))
              echo'<p>Votre adresse e-mail n\'est pas valide.</p>';
            else
            {
              echo'<p>Il faut remplir tous les champs !</p>';
              if(empty($message))
                $apercu_resultat='';
            }
          }
      }
    //Si les deux sont pleins et que l'adresse est valide, on envoie on on prévisualise sans envoi
    else
      {
        $domaine=preg_replace('#[^@]+@(.+)#','$1',$votremail);
        $DomaineMailExiste=checkdnsrr($domaine,'MX');
        if(!$DomaineMailExiste)
          echo'<p>Le nom de domaine de l\'adresse e-mail que vous avez donn&eacute; n\'existe pas.</p>';
        elseif(!empty($previsualiser))
            {
              $apercu_resultat='<p>Votre message et votre adresse e-mail sont valides et prêts &agrave; &ecirc;tre envoyés.
              <br>Vous n\'avez plus qu\'&agrave; cliquer sur le bouton "Envoyer".<br>Pr&eacute;visualisation :</p>';
              $Previsualiser='';
            }
        elseif(!empty($envoi))
            {
              $objet='[SITE] : '.$objet;
              $headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type:text/plain;charset=is-8859-1'."\r\n".'Sent:'.date('l, F d, Y H:i');
              if(mail($destinataire,$objet,$message,$headers))
              {
                echo '<p>Votre message a bien été envoy&eacute;. Merci.</p><p><a href="/">Retour &agrave; la page d\'accueil</a></p>';
                $Envoi='';
                $Previsualiser='';
              }
              else
                echo'<p>Un probl&egrave;me est survenu durant l\'envoi du mail.</p>';
            }
        else
          echo'<p>Une condition innatendue est survenue lors de l\'ex&eacute;cution du script.</p>';
      }
echo $apercu_resultat;
  }
else
  {
  echo '<p>Vous pouvez utiliser ce formulaire pour me contacter.</p>';
  $votremail='';$message='';
  }
$bas_formulaire=$Previsualiser.$Envoi;
?>
<form id='contact' method="post" action="<?php echo $_SERVER['PHP_SELF'];?>" enctype="multipart/form-data">
  <p id='obj'><label for='objet'>Objet de votre message :<br>
  <input type='text' name='objet' id='objet' tabindex='10' size='30'></label></p> 

  <p id="adr"><label for="mail">Votre Adresse E-mail<br>
  <input name="votremail" tabindex="20" size="30" type="text" id="mail" value="<?php echo $votremail; ?>"></label></p>
  
  <p id="msg"><label for="message">Votre message<br>
  <textarea tabindex="30" rows="20" cols="120" name="message" id="message"><?php echo $message; ?></textarea>
  </label></p>
<?php echo $bas_formulaire;?>
</form>
</body>
</html>

Une autre version en PHP5


Cet autre formulaire est écrit en PHP5 et ne comporte pas de pré-visualisation.
Le code source
<?php
    define( 'MAIL_TO', /* >>>>> */'utilisateur@domaine.tld'/* <<<<< */ );  //ajouter votre courriel
    define( 'MAIL_FROM', 'utilisateur@domaine.tld' ); // valeur par défaut
    define( 'MAIL_OBJECT', 'objet du message' ); // valeur par défaut
    define( 'MAIL_MESSAGE', 'votre message' ); // valeur par défaut

    $mailSent = false; // drapeau qui aiguille l'affichage du formulaire OU du récapitulatif
    $errors = array(); // tableau des erreurs de saisie
    
    if( filter_has_var( INPUT_POST, 'send' ) ) // le formulaire a été soumis avec le bouton [Envoyer]
    {
        $from = filter_input( INPUT_POST, 'from', FILTER_VALIDATE_EMAIL );
        if( $from === NULL || $from === MAIL_FROM ) // si le courriel fourni est vide OU égale à la valeur par défaut
        {
            $errors[] = 'Vous devez renseigner votre adresse de courrier &eacute;lectronique.';
        }
        elseif( $from === false ) // si le courriel fourni n'est pas valide
        {
            $errors[] = 'L\'adresse de courrier &eacute;lectronique n\'est pas valide.';
            $from = filter_input( INPUT_POST, 'from', FILTER_SANITIZE_EMAIL );
        }

        $object = filter_input( INPUT_POST, 'object', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH | FILTER_FLAG_ENCODE_LOW );
        if( $object === NULL OR $object === false OR empty( $object ) OR $object === MAIL_OBJECT ) // si l'objet fourni est vide, invalide ou égale à la valeur par défaut
        {
            $errors[] = 'Vous devez renseigner l\'objet.';
        }

	/* pas besoin de nettoyer le message. 
	/	http://www.phpsecure.info/v2/article/MailHeadersInject.php
	/	Logiquement, les parties message, To: et Subject: pourraient servir aussi à injecter quelque chose, 	mais la fonction mail()
	/	filtre bien les deux dernières, et la première est le message, et à partir du moment où on a sauté une ligne dans l'envoi du mail,
	/	c'est considéré comme du texte; le message ne saurait donc rester qu'un message.*/
        $message = filter_input( INPUT_POST, 'message', FILTER_UNSAFE_RAW );
        if( $message === NULL OR $message === false OR empty( $message ) OR $message === MAIL_MESSAGE ) // si le message fourni est vide ou égale à la valeur par défaut
        {
            $errors[] = 'Vous devez &eacute;crire un message.';
        }

        if( count( $errors ) === 0 ) // si il n'y a pas d'erreurs
        {
            if( mail( MAIL_TO, $object, $message, "From: $from\nReply-to: $from\n" ) ) // tentative d'envoi du message
            {
                $mailSent = true;
            }
            else // échec de l'envoi
            {
                $errors[] = 'Votre message n\'a pas &eacute;t&eacute; envoy&eacute;.';
            }
        }
    }
    else // le formulaire est affiché pour la première fois, avec les valeurs par défaut
    {
        $from = MAIL_FROM;
        $object = MAIL_OBJECT;
        $message = MAIL_MESSAGE;
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="fr" xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    <head>
        <title>Contact</title>
        <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
        <meta http-equiv="content-language" content="fr" />
        <style type="text/css">
html{ font-family:Geneva, Arial, Helvetica, sans-serif; margin:0; padding:0; font-size:.88em;}
body{ width:772px; margin:0 auto; padding:0; }
textarea{ width:772px; }
label{ display:block; font-weight:bold; }
p#welcome{ padding:10px 20px; border:1px dotted #00f; color:#00f; font-weight:bold; }
ul{ padding:10px 20px; border:1px dotted #f00; color:#f00; font-weight:bold; }
p#success{ padding:10px 20px; border:1px dotted #0f0; color:#0f0; font-weight:bold; }
p em{ display:block; font-weight:normal; }
        </style>
    </head>
    <body>
        <h1>Contact</h1>
        <hr />
<?php
    if( $mailSent === true ) // si le message a bien été envoyé, on affiche le récapitulatif
    {
?>
        <p id="success">Votre message a bien &eacute;t&eacute; envoy&eacute;.</p>
        <p><strong>Courriel pour la r&eacute;ponse&nbsp;:</strong><br /><?php echo( $from ); ?></p>
        <p><strong>Objet&nbsp;:</strong><br /><?php echo( $object ); ?></p>
        <p><strong>Message&nbsp;:</strong><br /><?php echo( nl2br( htmlspecialchars( $message ) ) ); ?></p>
<?php
    }
    else // le formulaire est affiché pour la première fois ou le formulaire a été soumis mais contenait des erreurs
    {
        if( count( $errors ) !== 0 )
        {
            echo( "\t\t<ul>\n" );
            foreach( $errors as $error )
            {
                echo( "\t\t\t<li>$error</li>\n" );
            }
            echo( "\t\t</ul>\n" );
        }
        else
        {
            echo( "\t\t<p id=\"welcome\"><em>Tous les champs sont obligatoires</em></p>\n" );
        }
?>
        <form id='contact' method="post" action="<?php echo( $_SERVER['REQUEST_URI'] ); ?>">
            <p>
                <label for="from">Courriel pour la r&eacute;ponse</label>
                <input type="text" name="from" id="from" value="<?php echo( $from ); ?>" />
            </p>
            <p>
                <label for="object">Objet</label>
                <input type="text" name="object" id="object" value="<?php echo( $object ); ?>" />
            </p> 
            <p>
                <label for="message">Message</label>
                <textarea name="message" id="message" rows="20" cols="80"><?php echo( $message ); ?></textarea>
            </p>
            <p>
                <input type="reset" name="reset" value="Effacer" />
                <input type="submit" name="send" value="Envoyer" />
            </p>
        </form>
<?php
    }
?>
    </body>
</html>
{CSS} Formulaire contact /facile Bonsoir tout le monde, j'ai deux petits problèmes sur mon formulaire de contact que je n'arrive pas a résoudre: Lien vers form: http://www.fabulousbox.com/site/contacts/ - le premier c'est la dénomination "Message" que j'aimerai placer en haut a... www.commentcamarche.net/forum/affich-12265065-css-formulaire-contact-facile
Modifier formulaire contact Outlook 2007 Bonjour, Je voudrais modifier le formulaire "Contact" standard de Outlook 2007 qui ne me convient pas. Par ex. je voudrais créer un autre champ "Téléphone mobile n°2" car aujourd'hui beaucoup de personnes ont 2 numéros de portable. J'ai bien essayé... www.commentcamarche.net/forum/affich-4853201-modifier-formulaire-contact-outlook-2007
Créer formulaire contact dans Outlook 2007 Bonjour, Je voudrais modifier le formulaire "Contact" standard de Outlook 2007 qui ne me convient pas. Par ex. je voudrais créer un autre champ "Téléphone mobile n°2" car aujourd'hui beaucoup de personnes ont 2 numéros de portable. J'ai bien essayé... www.commentcamarche.net/forum/affich-4765512-creer-formulaire-contact-dans-outlook-2007
Joomla (gestion de formulaire contact)Bonjour, je voudrais savoir comment faire pour ajouter des champs pour le formulaire contact de joomla sans avoir a toucher au code sinon c quoi la procédure si on doit toucher au code ? merci de votre réponse www.commentcamarche.net/forum/affich-11734758-joomla-gestion-de-formulaire-contact
Formulaire contact sur du flashHello a tous j'ai une petite question j'ai acheter une template en flash qui contenait une formulaire contact mais je n'arrive pas a mettre mon email afin de recevoir les mails Pouvez vous m'aidez cordialement Francommerce www.commentcamarche.net/forum/affich-4705236-formulaire-contact-sur-du-flash
Insertion formulaire dans un site WebBonjour ! J'aimerai savoir comment insérer un formulaire à zone de texte libre dans un site sans que son hébergeur ne gère les données. Merci d'avance. www.commentcamarche.net/forum/affich-21749-insertion-formulaire-dans-un-site-web
Attaques Cross-Site ScriptingInjection de code malicieux Les attaques de type Cross-Site Scripting (notée parfois XSS ou CSS) sont des attaques visant les sites web affichant dynamiquement du contenu utilisateur sans effectuer de contrôle et d'encodage des informations... www.commentcamarche.net/contents/attaques/cross-site-scripting.php3