ITSkillsCenter
Développement Web

Comment envoyer des emails avec PHP (formulaire de contact)

5 دقائق للقراءة

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

  1. Créez le formulaire HTML avec validation côté client
  2. Écrivez le script PHP avec validation côté serveur
  3. Ajoutez un champ honeypot anti-spam
  4. Ajoutez une limite de taux (1 message/minute)
  5. Testez en local avec XAMPP/WAMP
Besoin d'un site web ?

Confiez-nous la Création de Votre Site Web

Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.

À partir de 350.000 FCFA
Parlons de Votre Projet
Publicité