[PHP] Envoyer un mail

Bonjour,

J'ai créé un formulaire de contact dans lequel j'ai 3 input : nom, mail et message
Je voudrais que le visiteur de mon site l'utilise pour me contacter et me communiquer son nom, son mail et son message
Comment puis-je faire ?
Merci

Voici le code de mon formulaire

    <form method="post" action="mail.php">
        <h1><p align="center"><font color="blue"> Si vous voulez me contacter.</font></p></h1>
            <div class="corps-formulaire">
                <div class="gauche">
                    <div class="groupe">
                        <label><b> Votre nom</b> </label>
                        <input type="text" name="nom">
                    </div>
                    <div class="groupe">
                        <label><b> Votre adresse e-mail</b> </label>
                        <input type="text" name="mail">
                    </div>
                </div>
                <div class="droite">
                    <div class="groupe">
                        <label><b> Votre message</b></label>
                        <textarea></textarea>
                    </div>
                </div>
            </div>
            <div class="pied-formulaire" align="center">
                <input type="submit" value="Envoyer" /> 
            </div>
    </form>    

Bonjour,

Je n'avais pas très envie de tout écrire à la main cette fois, donc voici la réponse de l'IA (ton code HTML a été corrigé/amélioré aussi) :

<form method="post" action="mail.php">
    <h1 style="text-align: center; color: blue;">Si vous voulez me contacter</h1>
    <div class="corps-formulaire">
        <div class="gauche">
            <div class="groupe">
                <label for="nom"><b>Votre nom</b></label>
                <input type="text" id="nom" name="nom" required>
            </div>
            <div class="groupe">
                <label for="mail"><b>Votre adresse e-mail</b></label>
                <input type="email" id="mail" name="mail" required>
            </div>
        </div>
        <div class="droite">
            <div class="groupe">
                <label for="message"><b>Votre message</b></label>
                <textarea id="message" name="message" required></textarea>
            </div>
        </div>
    </div>
    <div class="pied-formulaire" style="text-align: center;">
        <input type="submit" value="Envoyer">
    </div>
</form>

Et le code PHP :

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // Récupération et sécurisation des données
    $nom = htmlspecialchars(trim($_POST['nom']));
    $email = htmlspecialchars(trim($_POST['mail']));
    $message = htmlspecialchars(trim($_POST['message']));

    // Vérification des champs obligatoires
    if (!empty($nom) && !empty($email) && !empty($message)) {

        // Vérification de la validité de l'adresse e-mail
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {

            // Configuration de l'email
            $to = "votre-adresse-email@example.com"; // Remplacez par votre adresse e-mail
            $subject = "Nouveau message de $nom";
            $body = "Nom: $nom\nEmail: $email\n\nMessage:\n$message";
            $headers = "From: $email";

            // Envoi de l'email
            if (mail($to, $subject, $body, $headers)) {
                echo "Votre message a été envoyé avec succès.";
            } else {
                echo "Une erreur s'est produite lors de l'envoi du message.";
            }
        } else {
            echo "Adresse e-mail invalide.";
        }
    } else {
        echo "Veuillez remplir tous les champs.";
    }
}
?>

Bonsoir Sébastien,

Les deux codes fonctionnent à merveille
Le message se construit correctement (je l'ai vérifié en récupérant ses éléments) et il m'est bien précisé que le message a été envoyé avec succès
Malheureusement ma boite mail (Outlook) reste désespérément vide .... ????
Encore merci

Malheureusement ma boite mail (Outlook) reste désespérément vide .... ????

As-tu modifié cette ligne ?

$to = "votre-adresse-email@example.com"; // Remplacez par votre adresse e-mail

pas de problème, ça bien été fait, j'ai mis mon adresse e-mail

Et rien dans les spams non plus ?

Si non, essaie avec ça :

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // Récupération et sécurisation des données
    $nom = htmlspecialchars(trim($_POST['nom']));
    $email = htmlspecialchars(trim($_POST['mail']));
    $message = htmlspecialchars(trim($_POST['message']));

    // Vérification des champs obligatoires
    if (!empty($nom) && !empty($email) && !empty($message)) {

        // Vérification de la validité de l'adresse e-mail
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {

            // Configuration de l'email
            $to = "votre-adresse-email@example.com"; // Remplacez par votre adresse e-mail
            $subject = "Nouveau message de $nom";
            $body = "Nom: $nom\nEmail: $email\n\nMessage:\n$message";
            $headers = [
                'MIME-Version: 1.0',
                'From: '.$email,
                'Reply-To: '.$email,
                'Content-Type: text/html; charset=utf-8',
                'Content-Transfer-Encoding: 8bit',
                'X-Mailer: PHP/'.phpversion()
            ];

            // Envoi de l'email
            if (mail($to, mb_encode_mimeheader($subject), $body, implode("\r\n", $headers))) {
                echo "Votre message a été envoyé avec succès.";
            } else {
                echo "Une erreur s'est produite lors de l'envoi du message.";
            }
        } else {
            echo "Adresse e-mail invalide.";
        }
    } else {
        echo "Veuillez remplir tous les champs.";
    }
}
?>

Bonjour Sébastien,

Non je n'ai rien non plus dans les spams

Avec ton nouveau code rien ne fonctionne, j'obtiens l'erreur suivante :

Cette page ne fonctionne pas

Impossible de traiter cette demande via www.poiluseymoutiers.fr à l'heure actuelle.

HTTP ERROR 500

Par contre, n'étant pas resté inactif, j'ai trouvé un bout de code qui me permet d'envoyer le mail, mais évidemment pas celui que j'attends car ce bout de code doit être aménagé, ce que je n'arrive pas à réaliser, ce mail est donc vide.

$retour = mail('mon-adresse@orange.fr', 'Envoi depuis la page Contact', $_POST['message'], '');
    if ($retour)
        echo '<p>Votre message a bien été envoyé.</p>';    

Je commence à me poser plein de questions, comment intégrer mes données dans cette ligne ('Envoi depuis la page Contact' et $_POST['message'] et puis ' ')

Encore un grand merci

Jacky

HTTP ERROR 500

C'est une erreur du serveur ... As-tu réessayé depuis ?

Je commence à me poser plein de questions, comment intégrer mes données dans cette ligne ('Envoi depuis la page Contact' et $_POST['message'] et puis ' ')

Le problème est qu'il manque pas mal de choses à ce code :

  • pas de htmlspecialchars (sécurité)
  • pas d'email du visiteur, ni de nom
  • aucun test pour vérifier si les 3 champs ont été renseigné
  • pas de test de validité de l'email
  • pas de headers (donc pas l'email de l'expéditeur)

Si là je modifie ton code en fonction de tout ça, il ressemblera au premier code transmis, donc autant reprendre directement ce code

Essaie avec le premier code légèrement modifié :

<?php
error_reporting(E_ALL); // Affiche les erreurs

if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // Récupération et sécurisation des données
    $nom = htmlspecialchars(trim($_POST['nom']));
    $email = htmlspecialchars(trim($_POST['mail']));
    $message = htmlspecialchars(trim($_POST['message']));

    // Vérification des champs obligatoires
    if (!empty($nom) && !empty($email) && !empty($message)) {

        // Vérification de la validité de l'adresse e-mail
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {

            // Configuration de l'email
            $to = "votre-adresse-email@example.com"; // Remplacez par votre adresse e-mail
            $subject = "Nouveau message de mon site";
            $body = "Nom: $nom\nEmail: $email\n\nMessage:\n$message";
            $headers = "From: $email";

            // Envoi de l'email
            if (mail($to, $subject, $body, $headers)) {
                echo "Votre message a été envoyé avec succès.";
            } else {
                echo "Une erreur s'est produite lors de l'envoi du message.";
            }
        } else {
            echo "Adresse e-mail invalide.";
        }
    } else {
        echo "Veuillez remplir tous les champs.";
    }
}
?>

En bricolant sans vraiment bien savoir ce que je devais faire, mais en faisant de nombreux essais, j'ai fini par obtenir satisfaction
Mais j'ai malheureusement du tronquer le premier code que tu m'avais donné, c'est à dire

<?php

//if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // Récupération et sécurisation des données
    $nom = htmlspecialchars(trim($_POST['nom']));
    $email = htmlspecialchars(trim($_POST['mail']));
    $message = htmlspecialchars(trim($_POST['message']));
    echo $nom;
    echo $email;
    echo $message;

/*     // Vérification des champs obligatoires
   if (!empty($nom) && !empty($email) && !empty($message))
        {

        // Vérification de la validité de l'adresse e-mail
        if (filter_var($email, FILTER_VALIDATE_EMAIL))
            {
*/        

           // Configuration de l'email
            $to = "mon-email@orange.fr"; // Remplacez par votre adresse e-mail
            //echo $to;
            $subject = "Nouveau message de $nom";
            //echo $subject;
            $body = "Nom: $nom\nEmail: $email\nMessage: $message";
            //echo $body;
            $headers = "From: $email";
/*
           // Envoi de l'email
            if (mail('mon-email@orange.fr', $subject, $body, $headers)) {
            //echo $headers;
                echo "Votre message a été envoyé avec succès.";
            } else {
                echo "Une erreur s'est produite lors de l'envoi du message.";
            }
        } else {
            echo "Adresse e-mail invalide.";
        }
    } else {
        echo "Veuillez remplir tous les champs.";
    }
}
*/

$retour = mail('mon-email@orange.fr', $subject, $body);
    if ($retour)
        echo '<p>Votre message a bien été envoyé.</p>';    
?>

Alors pourquoi
supprimer :

if ($_SERVER["REQUEST_METHOD"] == "POST") {

refuser les vérifications et le "$headers" dans l'envoi de email ?

Je vais essayer avec le code que tu viens de me donner et je te tiendrai au courant

Jacly

Sébastien,

J'ai bossé comme un fou toute la journée mais j'ai appris plein de choses et ai enfin réussi à faire fonctionner mon formulaire

<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") 

    // Récupération et sécurisation des données
    if (isset($_POST['nom']) and isset($_POST['mail']) and isset($_POST['message']))
    $nom = htmlspecialchars(trim($_POST['nom']));
    $email = htmlspecialchars(trim($_POST['mail']));
    $message = htmlspecialchars(trim($_POST['message']));

     // Vérification des champs obligatoires
        if (!empty($nom) && !empty($email) && !empty($message))
                {
                // Vérification de la validité de l'adresse e-mail
                    if ( filter_var(($_POST['mail']), FILTER_VALIDATE_EMAIL)  != TRUE)    
                    echo "votre adresse email est incorrecte";
                }    

           // Configuration de l'email
                $to = "mon-email@orange.fr"; // Remplacez par votre adresse e-mail
                $subject = "Nouveau message de $nom";
                $message = wordwrap($message, 70, "\r\n)");
                $body = "Nom: $nom\nEmail: $email\nMessage: $message";
                $headers = "From: $email";

           // Envoi de l'email
                $retour = mail($to, $subject, $body); 
                    if ($retour) {
                    echo "<p>Votre message a été envoyé avec succès.</p>";    
                    }
                    else {
                    echo "<p>Une erreur s'est produite lors de l'envoi du message.</p>";
                    }
?>

Dernier petit problème : il s'envoie 2 fois, une fois correctement, une deuxième fois complètement vide
Je vais chercher

Une fois de plus un grand merci à toi

Jacky

C'est bien s'il fonctionne mais il y a des erreurs importantes à corriger ...

Sache que si tu ne mets pas les {} après tes if, seule la première instruction sera prise en compte (quand on débute, mieux vaut mettre les {} à chaque fois pour éviter les surprises).

Voila ton code corrigé et indenté correctement (ce qui facilite sa lecture et permet de mieux visualiser ce qui est entre {}) :

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // Récupération et sécurisation des données
    if (isset($_POST['nom']) && isset($_POST['mail']) && isset($_POST['message'])) {

        $nom = htmlspecialchars(trim($_POST['nom']));
        $email = htmlspecialchars(trim($_POST['mail']));
        $message = htmlspecialchars(trim($_POST['message']));

        // Vérification des champs obligatoires
        if (!empty($nom) && !empty($email) && !empty($message)) {

            // Si adresse email incorrecte
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                echo "votre adresse email est incorrecte";

            // Si adresse email correcte
            } else {

                // Configuration de l'email
                $to = "mon-email@orange.fr"; // Remplacez par votre adresse e-mail
                $subject = "Nouveau message de $nom";
                $message = wordwrap($message, 70, "\r\n)");
                $body = "Nom: $nom\nEmail: $email\nMessage: $message";
                $headers = "From: $email";

                // Envoi de l'email
                if (mail($to, $subject, $body)) {
                    echo "<p>Votre message a été envoyé avec succès.</p>";    
                } else {
                    echo "<p>Une erreur s'est produite lors de l'envoi du message.</p>";
                }
            }
        }
    }        
}
?>

Dernier petit problème : il s'envoie 2 fois, une fois correctement, une deuxième fois complètement vide

Comme il manquait les {}, si tu affichais la page d'envoi sans utiliser le formulaire ou avec un formulaire vide, ça envoyait un email vide.

Bonsoir Sébastien,

J'ai fait un copier-coller du code que tu m'as donné afin de l'intégrer dans mon fichier
EH ben ! il me donne la même erreur 500 .... !!!!
J'en ai un peu mar.....
Je regarderai demain

Et là ?

<?php
// Récupération et sécurisation des données
if (isset($_POST['nom']) && isset($_POST['mail']) && isset($_POST['message'])) {

    $nom = htmlspecialchars(trim($_POST['nom']));
    $email = htmlspecialchars(trim($_POST['mail']));
    $message = htmlspecialchars(trim($_POST['message']));

    // Vérification des champs obligatoires
    if (!empty($nom) && !empty($email) && !empty($message)) {

        // Si adresse email incorrecte
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            echo "votre adresse email est incorrecte";

        // Si adresse email correcte
        } else {

            // Configuration de l'email
            $to = "mon-email@orange.fr"; // Remplacez par votre adresse e-mail
            $subject = "Nouveau message de $nom";
            $message = wordwrap($message, 70, "\r\n)");
            $body = "Nom: $nom\nEmail: $email\nMessage: $message";
            $headers = "From: $email";

            // Envoi de l'email
            if (mail($to, $subject, $body)) {
                echo "<p>Votre message a été envoyé avec succès.</p>";    
            } else {
                echo "<p>Une erreur s'est produite lors de l'envoi du message.</p>";
            }
        }
    }
}
?>

Bonjour Sébastien

Non toujours pas, mais ne te fais pas de soucis je vais voir cela de plus près cette après midi

Merci

J'avais aussi oublié de corriger cette ligne de ton code :

if (isset($_POST['nom']) and isset($_POST['mail']) and isset($_POST['message'])) {

A remplacer par :

if (isset($_POST['nom']) && isset($_POST['mail']) && isset($_POST['message'])) {

(&& = et)

Une méthode pour trouver la ligne qui pose problème est de déplacer un exit vers le bas.

Par exemple, commence par le mettre au début et tu auras une page blanche :

<?php
exit; // <=======================================
if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // Récupération et sécurisation des données
    if (isset($_POST['nom']) && isset($_POST['mail']) && isset($_POST['message'])) {

        $nom = htmlspecialchars(trim($_POST['nom']));
        $email = htmlspecialchars(trim($_POST['mail']));
        $message = htmlspecialchars(trim($_POST['message']));
        //...

(je ne mets volontairement pas tout le code ici)

Puis décale vers le bas :

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
exit; // <=======================================
    // Récupération et sécurisation des données
    if (isset($_POST['nom']) && isset($_POST['mail']) && isset($_POST['message'])) {

        $nom = htmlspecialchars(trim($_POST['nom']));
        $email = htmlspecialchars(trim($_POST['mail']));
        $message = htmlspecialchars(trim($_POST['message']));
        //...

Et décale encore :

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // Récupération et sécurisation des données
    if (isset($_POST['nom']) && isset($_POST['mail']) && isset($_POST['message'])) {
exit; // <=======================================
        $nom = htmlspecialchars(trim($_POST['nom']));
        $email = htmlspecialchars(trim($_POST['mail']));
        $message = htmlspecialchars(trim($_POST['message']));
        //...

Etc.

Et au bout d'un moment tu devrais avoir ton erreur 500 au lieu de la page blanche et ça te permettra d'identifier la ligne qui pose problème.

Après avoir bien réfléchi et surtout suivi tes conseils (en particulier la gestion des { }) j'ai fini par arranger mon code afin qu'il me donne satisfaction.
Voici le code qui fonctionne

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") 
//echo "Request méthode :".$_SERVER["REQUEST_METHOD"];

    // Récupération et sécurisation des données
    if (isset($_POST['nom']) and isset($_POST['mail']) and isset($_POST['message']))
    {
    $nom = htmlspecialchars(trim($_POST['nom']));
    $email = htmlspecialchars(trim($_POST['mail']));
    $message = htmlspecialchars(trim($_POST['message']));

     // Vérification des champs obligatoires
        if (!empty($nom) && !empty($email) && !empty($message))
                {
                // Vérification de la validité de l'adresse e-mail
                    if ( filter_var(($_POST['mail']), FILTER_VALIDATE_EMAIL)  != TRUE)
                    {    
                    echo "votre adresse email est incorrecte";
                    }
                }    
           // Configuration de l'email
                $to = "jacques.hanicot@orange.fr"; // Remplacez par votre adresse e-mail
                $subject = "Nouveau message de $nom";
                $message = wordwrap($message, 70, "\r\n)");
                $body = "Nom: $nom\nEmail: $email\nMessage: $message";
                $headers = "From: $email";
         // Envoi de l'email
                $envoyer = mail($to, $subject, $body); 
                    if ($envoyer)
                        {
                        echo "<p style='text-align: center'><b>Votre message a été envoyé avec succès.</b></p>";
                                                }
                        else
                        {
                        echo "<p style='text-align: center'>Une erreur s'est produite lors de l'envoi du message.</p>";
                        }
            // retour à la page 'intro'
                                ......................................... ?
    }
?>

Très satisfait, j'ai voulu ajouter un petit plus : permettre au visiteur de revenir à la page intro du site une fois son message envoyé.
Pour se faire j'ai construit un deuxième bouton "Retour" qui doit ouvrir cette page intro, mais il y a confusion avec le bouton "Envoyer"

Un petit challenge supplémentaire, je vais chercher et en cas de besoin ........
Sébastien je ne sais comment te remercier

Jacky

Le problème avec ce script est que ça va envoyer un email même si le visiteur n'a pas complété les champs et même s'il a indiqué une adresse email non valide.

permettre au visiteur de revenir à la page intro du site une fois son message envoyé.

Remplace cette ligne :

echo "<p style='text-align: center'><b>Votre message a été envoyé avec succès.</b></p>";

Par ces lignes :

header('Location: URL_INDEX_DU_SITE_ICI');
exit;

Tu as été plus rapide que moi, le temps de chercher et de trouver ..... ça m'a amené à une solution qui fonctionne.
Voici ce que j'ai ajouté dans mon formulaire

    <div class="pied-formulaire" style="text-align: center;">
        <input type="submit" value="Retour" name="Retour" onclick=(window.location="../../index.php")>
    </div>

Je considère que je suis arrivé à une finalité qui me convient énormément et ce grâce à Sébastien. Un énorme merci à lui

Jacky

PS : si certains d'entre vous veulent prendre connaissance de mon site, site sur les poilus de la guerre 14/18 de mon canton d'Eymoutiers, voici l'adresse
"poiluseymoutiers.fr"

Rechercher des sujets similaires à "php envoyer mail"