Un « Mailer » pour votre site web

Il est souvent indispensable pour un site web d’offrir à ses visiteurs la possibilité de contacter le webmaster par email.

Mieux qu’un lien « mailto: », un formulaire de contact permet au webmaster :
- de guider ses visiteurs en les invitant à remplir des rubriques prédéfinies,
- d’éviter d’afficher son adresse email sur le site, et de la préserver ainsi des robots chargés d’alimenter les bases de données de spam.

Le code proposé ici est celui d’un « mailer » prêt à l’emploi écrit en PHP. Il vous suffira de le copier dans un fichier que vous sauvegarderez dans votre site sous le nom de votre choix en prenant soin de lui donner l’extension « .php » (par exemple contact.php).

Vous pourrez alors le personnaliser en y ajoutant les rubriques correspondantes à votre besoin, puis agrémenter le tout de votre feuille de style.

Ce script repose sur la fonction PHP mail(). Il est abondamment commenté. Des liens vers les principales fonctions PHP qu’il utilise sont fournis à la fin de l’article.

<?php
// Dans la ligne qui suit, remplacer webmaster@domaine.tld par l'adresse 
// email du webmaster, à laquelle les messages devront être envoyés
$email_webmaster = "webmaster@domaine.tld";
// === traitement des données du formulaire ========
if (isset($_POST["envoyer"])){ 
// le formulaire a été soumis
        $etat = "erreur"; 
// Valeur par défaut. Prendra la valeur "ok" s'il n'y a pas d'erreur
// --- mise en forme des champs saisis dans le formulaire lors de sa soumission ---
        if (isset($_POST["email_expediteur"])) {
                 $_POST["email_expediteur"]=trim(stripslashes($_POST["email_expediteur"]));
        }
        if (isset($_POST["titre"])) {
                 $_POST["titre"]=trim(stripslashes($_POST["titre"]));
        }
        if (isset($_POST["message"])) {
                 $_POST["message"]=trim(stripslashes($_POST["message"]));
        }
        // --- test de la validité des champs saisis ---
        if (empty($_POST["email_expediteur"])) { 
        // il manque l'email de l'expéditeur
                 $erreur="Saisissez votre adresse email...";
        }
        elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",
                $_POST["email_expediteur"])){ 
        // l'adresse e-mail n'est pas valide
                 $erreur="Votre adresse e-mail n'est pas valide...";
        }
        elseif (empty($_POST["message"])) { 
        // le message est vide
                 $erreur="Saisissez un message...";
        }
        else { 
        // --- tous les champs sont correctement remplis: on pourra envoyer le mail ---
                 $etat="ok";
        }
}
else { 
// --- le formulaire n'a pas été soumis ---
           $etat="attente";
}
// === fin de traitement des données du formulaire ===========
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="fr" lang="fr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire de contact</title>
</head>
<body>
<h1>Contacter le webmaster</h1>
<?php
if ($etat!="ok"){// le formulaire n'a pas été soumis, ou soumis avec une erreur
         if ($etat=="erreur"){
         //le formulaire a été soumis avec une erreur
              echo "<p><strong>".$erreur."</strong></p>\n"; 
         // afficher le message d'erreur
         }
?>
        <form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
        <p><label for="email_expediteur">
                       Votre adresse e-mail (obligatoire):</label><br />
        <input type="text" size="40" name="email_expediteur" 
                           id="email_expediteur" value="<?php
        if (!empty($_POST["email_expediteur"])) { 
        // l'adresse email de l'expéditeur a été saisie: la réafficher
                echo htmlspecialchars($_POST["email_expediteur"],ENT_QUOTES);
        }
        ?>" />
        </p>
        <p><label for="titre">Titre de message (facultatif):</label><br />
        <input type="text" size="40" name="titre" id="titre" value="<?php
        if (!empty($_POST["titre"])) { 
        // le titre du message a été saisi: le réafficher
                echo htmlspecialchars($_POST["titre"],ENT_QUOTES);
        }
        ?>" />
        </p>
        <p><label for="message">Message (obligatoire):</label><br />
        <textarea name="message" id="message" cols="40" rows="5">
<?php
        if (isset($_POST["message"])) { 
        // le message a été saisi: le réafficher
                echo htmlspecialchars($_POST["message"],ENT_QUOTES);
        }
?>
        </textarea>
        </p>
        <p><input type="submit" name="envoyer" value="Envoyer" />
        </p>
        </form>
<?php
}
else {
// le formulaire a été soumis sans erreur, on envoie le mail
        $entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";
        $entete .= "MIME-Version: 1.0";
        if (@mail($email_webmaster,$_POST["titre"],$_POST["message"],$entete)){ 
// mail envoyé
                echo "Votre message a été envoyé.<br />\n";
                echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Envoyer un autre message...</a>\n";
        }
        else { 
// erreur lors de l'envoi du mail
                echo "Un problème s'est produit lors de l'envoi du message.\n";
                echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Réessayez...</a>\n";
        }
}
?>
</body>
</html>

Pour aller plus loin

Pour tout comprendre du fonctionnement de ce script, reportez vous à la documentation PHP des fonctions suivantes :
-mail()
-isset()
-empty()
-trim()
-stripslashes()
-htmlspecialchars()
-eregi()