Le formulaire de contact : indispensable pour tout site
Un formulaire de contact permet à vos visiteurs de vous écrire directement depuis votre site. Voici comment créer un formulaire fonctionnel et sécurisé avec PHP.
Le formulaire HTML
<form action="envoyer.php" method="POST" class="form-contact">
<div class="champ">
<label for="nom">Nom complet *</label>
<input type="text" id="nom" name="nom" required minlength="2">
</div>
<div class="champ">
<label for="email">Email *</label>
<input type="email" id="email" name="email" required>
</div>
<div class="champ">
<label for="sujet">Sujet</label>
<select id="sujet" name="sujet">
<option value="info">Demande d'information</option>
<option value="devis">Demande de devis</option>
<option value="support">Support technique</option>
<option value="autre">Autre</option>
</select>
</div>
<div class="champ">
<label for="message">Message *</label>
<textarea id="message" name="message" rows="6" required minlength="10"></textarea>
</div>
<button type="submit" name="envoyer">Envoyer le message</button>
</form>
Le script PHP (envoyer.php)
<?php
// Vérifier que le formulaire a été soumis
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: contact.html');
exit;
}
// 1. Récupérer et nettoyer les données
$nom = htmlspecialchars(strip_tags(trim($_POST['nom'])));
$email = filter_var(trim($_POST['email']), FILTER_SANITIZE_EMAIL);
$sujet = htmlspecialchars(strip_tags(trim($_POST['sujet'])));
$message = htmlspecialchars(strip_tags(trim($_POST['message'])));
// 2. Valider les données
$erreurs = [];
if (strlen($nom) < 2) {
$erreurs[] = "Le nom est trop court";
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$erreurs[] = "Email invalide";
}
if (strlen($message) < 10) {
$erreurs[] = "Le message est trop court (10 caractères minimum)";
}
// 3. S'il y a des erreurs, les afficher
if (!empty($erreurs)) {
foreach ($erreurs as $erreur) {
echo "<p style='color:red;'>⚠️ $erreur</p>";
}
echo "<a href='javascript:history.back()'>← Retour au formulaire</a>";
exit;
}
// 4. Préparer et envoyer l'email
$destinataire = "contact@votresite.sn";
$sujet_email = "Contact depuis le site : $sujet";
$contenu = "Nouveau message depuis le formulaire de contact\n\n";
$contenu .= "Nom : $nom\n";
$contenu .= "Email : $email\n";
$contenu .= "Sujet : $sujet\n";
$contenu .= "Message :\n$message\n";
$headers = "From: $email\r\n";
$headers .= "Reply-To: $email\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
if (mail($destinataire, $sujet_email, $contenu, $headers)) {
echo "<h2>✅ Message envoyé avec succès !</h2>";
echo "<p>Nous vous répondrons sous 24h.</p>";
} else {
echo "<h2>❌ Erreur lors de l'envoi</h2>";
echo "<p>Veuillez réessayer ou nous contacter directement.</p>";
}
?>
Version améliorée avec PHPMailer (recommandé)
La fonction mail() native est limitée. PHPMailer est plus fiable et supporte SMTP :
// Installer via Composer
// composer require phpmailer/phpmailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
$mail = new PHPMailer(true);
try {
// Configuration SMTP (exemple avec Gmail)
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'votre@gmail.com';
$mail->Password = 'mot_de_passe_application'; // Pas votre mot de passe Gmail !
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';
// Expéditeur et destinataire
$mail->setFrom('votre@gmail.com', 'Mon Site');
$mail->addAddress('contact@votresite.sn');
$mail->addReplyTo($email, $nom);
// Contenu
$mail->isHTML(true);
$mail->Subject = "Contact : $sujet";
$mail->Body = "
<h2>Nouveau message de contact</h2>
<p><strong>Nom :</strong> $nom</p>
<p><strong>Email :</strong> $email</p>
<p><strong>Message :</strong></p>
<p>$message</p>
";
$mail->send();
echo "Message envoyé !";
} catch (Exception $e) {
echo "Erreur : " . $mail->ErrorInfo;
}
Protection anti-spam
<!-- Honeypot : champ invisible pour piéger les bots -->
<div style="display:none;">
<input type="text" name="website" value="">
</div>
<!-- PHP : rejeter si le honeypot est rempli -->
<?php
if (!empty($_POST['website'])) {
// C'est un bot ! Ignorer silencieusement
header('Location: merci.html');
exit;
}
// Limiter le taux d'envoi (1 message par minute)
session_start();
if (isset($_SESSION['dernier_envoi']) &&
time() - $_SESSION['dernier_envoi'] < 60) {
die("Veuillez attendre avant d'envoyer un autre message.");
}
$_SESSION['dernier_envoi'] = time();
?>
CSS du formulaire
.form-contact {
max-width: 600px;
margin: 40px auto;
padding: 30px;
}
.champ { margin-bottom: 20px; }
.champ label {
display: block;
margin-bottom: 6px;
font-weight: 600;
color: #333;
}
.champ input, .champ select, .champ textarea {
width: 100%;
padding: 12px;
border: 2px solid #e0e0e0;
border-radius: 8px;
font-size: 16px;
transition: border-color 0.3s;
}
.champ input:focus, .champ textarea:focus {
border-color: #667eea;
outline: none;
}
button[type="submit"] {
width: 100%;
padding: 14px;
background: #667eea;
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
cursor: pointer;
transition: background 0.3s;
}
button[type="submit"]:hover { background: #5a6fd6; }
Exercice pratique
🎯 Défi : Formulaire de contact complet
- Créez le formulaire HTML avec validation côté client
- Écrivez le script PHP avec validation côté serveur
- Ajoutez un champ honeypot anti-spam
- Ajoutez une limite de taux (1 message/minute)
- Testez en local avec XAMPP/WAMP