Pour utiliser le protocole SMTP au lieu de la fonction mail() de PHP, vous pouvez utiliser une bibliothèque SMTP comme PHPMailer.

Dans cet exemple, vous devez remplacer ’smtp.example.com’ par l’adresse du serveur SMTP que vous utilisez, ’votre_email@example.com’ par votre adresse e-mail et ’votre_mot_de_passe’ par votre mot de passe de messagerie.

Assurez-vous de télécharger la bibliothèque PHPMailer depuis son site officiel (https://github.com/PHPMailer/PHPMailer) et de spécifier le chemin correct vers les fichiers de la bibliothèque dans les directives require du fichier process.php.

Ce code utilisant PHPMailer vous permettra d’envoyer des e-mails via le protocole SMTP, ce qui est généralement considéré comme plus sécurisé que l’utilisation de la fonction mail() de PHP.

Assurez-vous d’avoir installé PHPMailer via Composer en exécutant la commande suivante dans votre projet :

composer require phpmailer/phpmailer

Ensuite, vous pouvez inclure PHPMailer en utilisant

require 'vendor/autoload.php';

Dans le code, vous devez remplacer ’smtp.example.com’ par l’adresse du serveur SMTP que vous utilisez, ’votre_email@example.com’ par votre adresse e-mail et ’votre_mot_de_passe’ par votre mot de passe de messagerie.

Veillez également à ajuster les champs de formulaire HTML (to, subject, message) dans le fichier HTML correspondant.

Avec ces modifications, le code utilisera PHPMailer pour envoyer des e-mails via SMTP.

Voici un exemple de formulaire utilisant PHPMailer pour envoyer des e-mails via SMTP :

<?php
session_start();

// Récupération des erreurs
$errors = isset($_SESSION['errors']) ? $_SESSION['errors'] : [];
unset($_SESSION['errors']);

// Récupération des valeurs saisies
$firstNameValue = isset($_SESSION['form_values']['firstName']) ? $_SESSION['form_values']['firstName'] : '';
$lastNameValue = isset($_SESSION['form_values']['lastName']) ? $_SESSION['form_values']['lastName'] : '';
$emailValue = isset($_SESSION['form_values']['email']) ? $_SESSION['form_values']['email'] : '';
$phoneValue = isset($_SESSION['form_values']['phone']) ? $_SESSION['form_values']['phone'] : '';
$messageValue = isset($_SESSION['form_values']['message']) ? $_SESSION['form_values']['message'] : '';
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Contact</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
    <link href='https://fonts.googleapis.com/css?family=Lato:300,400,500' rel='stylesheet' type='text/css'>
	<script src="https://www.google.com/recaptcha/api.js?render=VOTRE_CLE_DE_SITE_ICI"></script>
    <link href='custom.css' rel='stylesheet' type='text/css'>
    <style>
        .error {
            color: red;
            font-style: italic;
            margin-bottom: 1em;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-xl-8 offset-xl-2">
            <h1>Contact</h1>
            <h2 style="margin-bottom: 1.5em; font-style: italic;">Merci de remplir ce formulaire, nous vous recontacterons rapidement.</h2>
            <?php
            // Affichage des erreurs
            if (!empty($errors)) {
                foreach ($errors as $error) {
                    echo '<div class="error">' . $error . '</div>';
                }
            }
            ?>
            <form id="myForm" method="post" action="process.php">
                <div class="form-group">
                    <label for="firstName">Prénom :</label>
                    <input type="text" name="firstName" id="firstName" class="form-control" required
                           value="<?php echo htmlspecialchars($firstNameValue); ?>">
                </div>
                <div class="form-group">
                    <label for="lastName">Nom :</label>
                    <input type="text" name="lastName" id="lastName" class="form-control" required
                           value="<?php echo htmlspecialchars($lastNameValue); ?>">
                </div>
                <div class="form-group">
                    <label for="email">E-mail :</label>
                    <input type="email" name="email" id="email" class="form-control" required
                           value="<?php echo htmlspecialchars($emailValue); ?>">
                </div>
                <div class="form-group">
                    <label for="phone">Téléphone :</label>
                    <input type="tel" name="phone" id="phone" placeholder="Entrez 10 chiffres sans espaces uniquement" class="form-control" required
                           value="<?php echo htmlspecialchars($phoneValue); ?>">
                </div>
                <div class="form-group">
                    <label for="message">Message :</label>
                    <textarea name="message" id="message" class="form-control" required rows="5"><?php echo htmlspecialchars($messageValue); ?></textarea>
                </div>
                <button type="submit" class="btn btn-primary">Envoyer</button>
            </form>
        </div>
    </div>
    </div>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
	<script>
  document.addEventListener('DOMContentLoaded', function() {
    var form = document.getElementById('myForm'); // Remplacez 'your-form-id' par l'ID de votre formulaire
    form.addEventListener('submit', function(event) {
      event.preventDefault();
      grecaptcha.ready(function() {
        grecaptcha.execute('VOTRE_CLE_DE_SITE_ICI', {action: 'submit'}).then(function(token) {
          // Ajoutez le token reCAPTCHA à votre formulaire
          var recaptchaResponse = document.createElement('input');
          recaptchaResponse.setAttribute('type', 'hidden');
          recaptchaResponse.setAttribute('name', 'recaptchaResponse');
          recaptchaResponse.setAttribute('value', token);
          form.appendChild(recaptchaResponse);
          // Soumettez votre formulaire
          form.submit();
        });
      });
    });
  });
</script>
</body>
</html>

Dans le fichier process.php, vous aurez besoin de la bibliothèque PHPMailer pour gérer l’envoi de l’e-mail via SMTP. Voici un exemple de code utilisant PHPMailer :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

session_start();

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $firstName = $_POST["firstName"];
    $lastName = $_POST["lastName"];
    $email = $_POST["email"];
    $phone = $_POST["phone"];
    $message = $_POST["message"];

	$recaptchaResponse = $_POST['recaptchaResponse'];
	$secretKey = 'YOUR_SECRET_KEY'; // Remplacez 'YOUR_SECRET_KEY' par votre propre clé secrète

	$recaptchaUrl = 'https://www.google.com/recaptcha/api/siteverify';
	$recaptchaData = [
	  'secret' => $secretKey,
	  'response' => $recaptchaResponse,
	  'remoteip' => $_SERVER['REMOTE_ADDR']
	];

	$recaptchaOptions = [
	  'http' => [
		'method' => 'POST',
		'content' => http_build_query($recaptchaData),
		'header' => 'Content-Type: application/x-www-form-urlencoded'
	  ]
	];

	$recaptchaContext = stream_context_create($recaptchaOptions);
	$recaptchaResult = file_get_contents($recaptchaUrl, false, $recaptchaContext);
	$recaptchaResult = json_decode($recaptchaResult);

	if ($recaptchaResult->success) {
	  // Le reCAPTCHA a été validé avec succès, continuez le traitement du formulaire
	} else {
	  // Le reCAPTCHA n'a pas été validé, gérez l'erreur
	}

    // Valider les données
    $errors = [];

    // Validation du prénom
    if (empty($firstName)) {
        $errors[] = "Le prénom est obligatoire.";
    }

    // Validation du nom
    if (empty($lastName)) {
        $errors[] = "Le nom est obligatoire.";
    }

    // Validation de l'adresse e-mail
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "L'adresse e-mail n'est pas valide.";
    }

    // Validation du numéro de téléphone
    if (strlen($phone) !== 10) {
        $errors[] = "Le numéro de téléphone doit contenir exactement 10 chiffres.";
    } elseif (!preg_match('/^\+?\d{1,3}?[-.\s]?\(?\d{1,3}?\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4}$/', $phone)) {
        $errors[] = "Le numéro de téléphone n'est pas valide.";
    }

    // Validation du message
    if (empty($message)) {
        $errors[] = "Le message est obligatoire.";
    }

    if (!empty($errors)) {
        $_SESSION['errors'] = $errors;
        $_SESSION['form_values'] = [
            'firstName' => $firstName,
            'lastName' => $lastName,
            'email' => $email,
            'phone' => $phone,
            'message' => $message
        ];
        header("Location: formSMTP.php");
        exit;
    }

    // Les données sont valides, continuer le traitement du formulaire
    // ...

    // Envoyer l'e-mail ou effectuer d'autres actions nécessaires
    // ...

    $mail = new PHPMailer(true);

    try {
        // Configuration du serveur SMTP
        $mail->isSMTP();
        $mail->Host = 'smtp.nom_hote'; // Remplacez par le nom d'hôte SMTP de votre fournisseur de messagerie
        $mail->SMTPAuth = true;
        $mail->Username = 'contact@votresite.com'; // Remplacez par votre adresse e-mail
        $mail->Password = 'MOT_DE_PASSE'; // Remplacez par votre mot de passe
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // Utilisez SSL
        $mail->Port = XXX ; // Port SSL remplacez XXX par votre port SSL

        // Définition de l'encodage du message
        $mail->CharSet = 'UTF-8';

        // Adresse e-mail de l'expéditeur
        $fromEmail = 'contact@votresite.com';
        $fromName = 'VOTRE NOM OU CELUI DE VOTRE SITE';

        $mail->setFrom($fromEmail, $fromName);
        $mail->addAddress('votremail@gmail.com'); // Remplacez par l'adresse e-mail du destinataire gmail ou autre

        // Répondre à l'expéditeur du formulaire
        $replyToEmail = $_POST['email'];
        $replyToName = $_POST['firstName'] . ' ' . $_POST['lastName'];

        $mail->addReplyTo($replyToEmail, $replyToName);

        // Destinataire, sujet, corps de l'e-mail
        $mail->setFrom('contact@votresite.com', 'Votre Site'); // Remplacez par votre adresse e-mail et votre nom
        $mail->addAddress('votremail@yahoo.fr'); // Remplacez par l'adresse e-mail du destinataire
        $mail->Subject = 'Nouvelle demande de Votre Site';
        $mail->Body = "Prénom : $firstName\n"
            . "Nom : $lastName\n"
            . "E-mail : $email\n"
            . "Téléphone : $phone\n"
            . "Message : $message";

        // Envoyer l'e-mail
        $mail->send();

        // Réponse en cas de succès
        echo '<div style="background-color: #e6f7ea; padding: 10px; border-radius: 5px;">';
        echo '<h3 style="color: #2c9e22;">L\'e-mail a été envoyé avec succès.</h3>';
        echo '</div>';

        // Effacer les valeurs des champs du formulaire
        $_POST['firstName'] = '';
        $_POST['lastName'] = '';
        $_POST['email'] = '';
        $_POST['phone'] = '';
        $_POST['message'] = '';

        unset($_SESSION['form_values']);
    } catch (Exception $e) {
        // Réponse en cas d'erreur
        echo '<div style="background-color: #f7e6e6; padding: 10px; border-radius: 5px;">';
        echo '<h3 style="color: #9e2222;">Une erreur s\'est produite lors de l\'envoi de l\'e-mail : ' . $mail->ErrorInfo . '</h3>';
        echo '</div>';
    }
}

Dans ce code, vous devez remplacer "VOTRE_CLE_SECRETE_RECAPTCHA" par votre propre clé secrète reCAPTCHA obtenue à partir du tableau de bord reCAPTCHA de Google.

Le code effectue une vérification du reCAPTCHA v3 en envoyant une demande HTTP vers l’API reCAPTCHA pour valider la réponse du reCAPTCHA. Si la réponse du reCAPTCHA est invalide ou si le score est inférieur à 0.5, une erreur est affichée et l’e-mail ne sera pas envoyé.

Assurez-vous également d’ajuster les champs de formulaire HTML (to, subject, message, g-recaptcha-response) dans le fichier HTML correspondant.

Avec ces modifications, le code utilisera PHPMailer pour envoyer des e-mails via SMTP avec la validation du reCAPTCHA v3 de Google.

Pour afficher la réponse sur une autre page,

Vous pouvez utiliser la redirection HTTP après le traitement du formulaire dans process.php. Voici comment vous pouvez le faire :

Dans process.php, une fois que vous avez vérifié que l’e-mail a été envoyé avec succès, vous pouvez stocker un message de réussite dans une variable :

$successMessage = 'L\'e-mail a été envoyé avec succès.';

Ensuite, vous pouvez rediriger l’utilisateur vers une autre page qui affichera ce message de réussite. Vous pouvez utiliser la fonction header() pour effectuer la redirection. Par exemple, vous pouvez ajouter cette ligne de code après avoir envoyé l’e-mail avec succès :

header("Location: confirmation.php");
exit;

Assurez-vous de placer cette ligne de code juste après la ligne qui affiche le message de réussite. Cela redirigera l’utilisateur vers la page confirmation.php.

Dans le fichier confirmation.php, vous pouvez récupérer le message de réussite et l’afficher comme suit :

<?php
session_start();

$successMessage = isset($_SESSION['success_message']) ? $_SESSION['success_message'] : '';

// Supprimez le message de réussite de la session
unset($_SESSION['success_message']);
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Confirmation</title>
    <link rel="stylesheet" href="styles.css"> <!-- Incluez votre fichier CSS si nécessaire -->
</head>
<body>
    <div class="confirmation-container">
        <h3><?php echo $successMessage; ?></h3>
    </div>
</body>
</html>

Dans cet exemple, nous récupérons le message de réussite à partir de la session ($_SESSION[’success_message’]) et l’affichons dans la balise h3 de la page confirmation.php. Vous pouvez également styliser la page en incluant un fichier CSS approprié.

Assurez-vous de configurer correctement les chemins des fichiers et de vous assurer que les pages process.php et confirmation.php sont bien liées dans votre formulaire.


Si déjà à ce stade tout va bien pour vour :-) que tout fonctionne, eh bien j’en suis ravie pour vous, dans le cas contraire, voici quelques erreurs que vous pouvez rencontrer, parmi tant d’autres ^^

Erreur de captcha type de clé non valide

Si le formulaire indique cette erreur : ERREUR pour le propriétaire du site : Type de clé non valide
ChatGPT
L’erreur "ERREUR pour le propriétaire du site : Type de clé non valide" indique généralement que vous avez utilisé une clé incorrecte ou incompatible avec le type de reCAPTCHA que vous essayez d’utiliser ou que le mail de l’expéditeur (FROM) ne correspond pas à votre nom de domaine. Il doit être de ce type "contact@votrenomdedomaine.com" dans le fichier process.php du formulaire. En revanche, c’est un mail @gmail de votre compte google comme propriétaire des clefs site et secrète de recaptcha.

Veuillez vérifier les points suivants pour résoudre cette erreur :

Vérifier que le FROM est bien celui de votre nom de domaine.

Clé reCAPTCHA v3 : Assurez-vous d’utiliser une clé de site reCAPTCHA v3 valide. Vous pouvez générer une clé de site reCAPTCHA v3 sur la page de configuration reCAPTCHA de votre compte Google reCAPTCHA.

Compatibilité de la clé : Vérifiez que vous utilisez bien une clé de site reCAPTCHA v3 pour le reCAPTCHA v3. Les clés de site reCAPTCHA v2 ne fonctionneront pas avec le reCAPTCHA v3.

Emplacement de la clé : Assurez-vous que la clé de site reCAPTCHA v3 est correctement définie dans le fichier HTML du formulaire. Assurez-vous également que la clé est utilisée correctement dans le code PHP pour valider la réponse du reCAPTCHA.

Configuration du site reCAPTCHA : Assurez-vous que la configuration du site reCAPTCHA dans votre compte Google reCAPTCHA est correcte et correspond à l’environnement dans lequel vous utilisez le reCAPTCHA (par exemple, domaine ou adresse IP correcte, paramètres de sécurité appropriés, etc.).

Assurez-vous également de bien suivre les instructions de configuration du reCAPTCHA v3 de Google pour vous assurer que toutes les étapes ont été correctement suivies.

Si vous avez vérifié tous ces éléments et que l’erreur persiste, il peut être utile de consulter la documentation de reCAPTCHA de Google ou de contacter leur support pour obtenir une assistance supplémentaire spécifique à votre cas.

Si vous avez une erreur 500

Si vous avez une erreur 500 alors que le chemin est pourtant le bon : L’erreur 500 est un code d’erreur interne du serveur, ce qui signifie qu’il y a un problème au niveau du serveur qui empêche l’exécution de votre script PHP.

Voici quelques points à vérifier pour résoudre cette erreur :

Déjà vérifiez la casse, perso, lorsque j’ai fais l’installation de phpMailer via composer, il m’a tout installé avec des noms de dossier en minuscule... j’ai mis un petit moment à comprendre ! lol !

Assurez-vous que vous avez correctement installé PHPMailer via Composer en exécutant la commande composer require phpmailer/phpmailer. Cela créera un répertoire vendor à la racine de votre projet et y installera PHPMailer avec ses dépendances.

Vérifiez que le chemin d’inclusion des fichiers de PHPMailer est correct dans votre fichier process.php. Si vous avez installé PHPMailer via Composer, le chemin d’inclusion devrait être require ’vendor/autoload.php’ ;.

Assurez-vous que les noms des espaces de noms (namespaces) et des classes utilisés dans votre fichier process.php sont corrects. Le namespace de PHPMailer est PHPMailer\PHPMailer.

Assurez-vous également que les autres parties de votre code, telles que la configuration du serveur SMTP et l’envoi de l’e-mail, sont correctement mises en place.

Si vous continuez à rencontrer une erreur 500, je vous recommande de vérifier les journaux d’erreur du serveur web pour obtenir des informations plus détaillées sur l’erreur spécifique qui se produit. Les journaux d’erreur du serveur peuvent être consultés via le panneau de contrôle de votre hébergeur ou en accédant directement aux fichiers journaux du serveur.