je teste un code trouve sur le web pour la récupération d'un mot de passe, lorsque l'utilisateur a perdu le sien sur son espace membre
donc il ouvre
mot-de-passe-oublie.php
rentre son adresse mail et devrait recevoir un mail avec un lien pour la réinitialisation
Sauf que la il ne le recois pas

merci de l aide

Ce que je fais

le code que j ai trouve

<?php
    /*************************
    *  Page: mot-de-passe-oublie.php
    *  Page encodée en UTF-8
    **************************/
//configuration pour la connexion SQL:
$SQL['host']="localhost";//serveur
$SQL['user']="root";//nom d'utilisateur
$SQL['pass']="";//pass
$SQL['base']="nom_de_la_base_de_donnees";//nom de la base de données
?><!DOCTYPE HTML>
<html>
    <head>
        <title>Script espace membre</title>
    </head>
    <body>
        <h1>Récupération du mot de passe</h1>
        <a href="./">Retour à l'accueil</a>

        <?php
        if(isset($_GET['code'],$_GET['mail'])){
            //un lien est cliqué dans un mail, on recherche si le code et le mail correspondent à une ligne dans la table "recup_mdp"
            $Code=htmlentities($_GET['code'],ENT_QUOTES,"UTF-8");
            $Mail=htmlentities($_GET['mail'],ENT_QUOTES,"UTF-8");
            $mysqli=mysqli_connect($SQL['host'],$SQL['user'],$SQL['pass'],$SQL['base']);
            if(!$mysqli) {
                echo "Erreur connexion BDD";
                //Dans ce script, je pars du principe que les erreurs ne sont pas affichées sur le site, vous pouvez donc voir qu'elle erreur est survenue avec mysqli_connect_error(), pour cela décommentez la ligne suivante:

                //echo "<br>Erreur retournée: ".mysqli_connect_error();

            } else {
                $req=mysqli_query($mysqli,"SELECT * FROM recup_mdp WHERE code='$Code' AND mail='$Mail'");
                if(mysqli_num_rows($req)==1){
                    //on génère un nouveau pass (de 5 caractères) et on lui envoi:
                    $NouveauPass=substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"),0,5);
                    //on modifie son mot de passe pour son compte
                    mysqli_query($mysqli,"UPDATE membres SET mdp='".md5($NouveauPass)."' WHERE mail='$Mail'");
                    //on ui envoi un mail avec son pass temporaire:
                    mail($Mail,"Votre nouveau mot de passe","Le nouveau mot de passe pour votre compte est: $NouveauPass (Il est vivement conseille de le modifier depuis votre espace membre)");
                    //on supprime la demande mot de passe qui est dans la table "recup_mdp":
                    mysqli_query($mysqli,"DELETE FROM recup_mdp WHERE code='$Code' AND mail='$Mail'");
                    echo "Votre nouveau pass temporaire vient d'être envoyé par mail.";
                } else {
                    echo "Lien incorrect.";
                }
            }
        } else {
            //si le formulaire est envoyé ("envoyé" signifie que le bouton submit est cliqué)
            if(isset($_POST['valider'])){
                //vérifie si le champ mail est bien rempli:
                if(empty($_POST['mail'])){
                    echo "Le champs mail n'est pas renseigné.";
                } else {
                    //tous les champs sont précisés, on regarde si le membre est inscrit dans la bdd:
                    //d'abord il faut créer une connexion à la base de données dans laquelle on souhaite regarder:
                    $mysqli=mysqli_connect($SQL['host'],$SQL['user'],$SQL['pass'],$SQL['base']);
                    if(!$mysqli) {
                        echo "Erreur connexion BDD";
                        //Dans ce script, je pars du principe que les erreurs ne sont pas affichées sur le site, vous pouvez donc voir qu'elle erreur est survenue avec mysqli_error(), pour cela décommentez la ligne suivante:

                        //echo "<br>Erreur retournée: ".mysqli_error($mysqli);

                    } else {
                        //on défini nos variables:
                        $Mail=htmlentities($_POST['mail'],ENT_QUOTES,"UTF-8");//htmlentities avec ENT_QUOTES permet de sécuriser la requête pour éviter les injections SQL, UTF-8 pour dire de convertir en ce format
                        $req=mysqli_query($mysqli,"SELECT * FROM membres WHERE mail='$Mail'");
                        //on regarde si le membre est inscrit dans la bdd:
                        //même si le membre n'existe pas, on affiche qu'un mail à été envoyé, ceci permet d'empécher les robots de voir si un mail existe ou pas dans votre base de données et de vous le dérober
                        if(mysqli_num_rows($req)!=1){
                            //mail inconnu
                        } else {
                            //mail connu, on lance la procédure d'envoi du mail pour recevoir un nouveau mdp
                            $Code=md5(rand(1,99999999));
                            mysqli_query($mysqli,"INSERT INTO recup_mdp SET code='$Code', mail='$Mail'");
                            $Lien=$_SERVER['HTTP_HOST']."/mot-de-passe-oublie.php?code=$Code&mail=$Mail";
                            mail($Mail,"Recuperation du mot de passe","Pour recevoir un nouveau mot de passe cliquez sur le lien suivant: $Lien");
                        }
                        echo "<p>Si votre mail est inscrit, vous allez recevoir un mail contenant un lien à cliquer afin de recevoir un nouveau mot de passe.</p>";
                        $TraitementFini=true;//pour cacher le formulaire
                    }
                }
            }
            if(!isset($TraitementFini)){//quand le membre sera connecté, on définira cette variable afin de cacher le formulaire
                ?>
                <br>
                <p>Remplissez le formulaire ci-dessous pour recevoir un nouveau mot de passe:</p>
                <form method="post" action="mot-de-passe-oublie.php">
                    <input type="text" name="mail" placeholder="Votre mail..." required><!-- required permet d'empêcher l'envoi du formulaire si le champ est vide -->
                    <input type="submit" name="valider" value="Recevoir un nouveau mot de passe">
                </form>
                <?php
            }
        }
        ?>
    </body>
</html>

Ce que je veux

je souhaiterais recevoir l email pour le changement de mot de passe

Ce que j'obtiens

tout ce passe bien , lors de l envoi de l adresse mail de l utilisateur ayant perdu son mot de passe
mais le mail avec le lien de reinitialisation n arrive pas ...
pourtant l adresse mail existe

33 réponses


T'as regardé si tu as un sendmail d'activé ???
https://grafikart.fr/blog/mail-local-wamp

bonjour
merci pour l aide
en fait je travaille en direct sur le site heberge
les infos de la table et base de donnee ont ete change

Pourquoi tu ne fait pas tes test plutot sur un serveur local ?
C'est beaucoup plus simple.

tout simplement car c est la derniere chose a realiser pour que mon site fonctionne

D'accord !!!
Pourrais-tu me donner l'adresse du serveur que je jette un coup d'oeil ?

merci
Ah oui, pour le moment tout est en /essai

moi qui te remercie pour l aide

Il manque plus que le css sur la partie connexion

c est a dire ???

Il n'y a pas de css quand je me connecte

ah non juste
amsi cela est bien plus tard quand tout sera fonctionnel

D'accord

Bonne journée

oui mais le code ne fonctionne pas

je rentre son adresse mail
il devrait recevoir un mail avec un lien pour la réinitialisation
Sauf que la il ne le recois pas

la fonction mail a besoin du headers maintenant pour fonctionner car beaucoup de serveur mail supprime le mail quand il n'y a pas de headers.
ensuite comme tu peux le voir sur la doc. la fonction mail renvoie true ou false suivant si elle s'est bien exécutée. il serait bien d'avoir ce retour

merci pour l aide
mais dans ce code il n y a pas de headers

Il faut que tu rajoute un From qui définit l'adresse email qui envoie le mail en quatrième paramètre (de cette façon : mail($adressse de réception, $objet, $contenu, ['From : no-reply@localhost.fr']);

merci pour la reponse
j essaye de comprendre comment je dois rajouter cela ...
apparement c est dans la partie php ...

Merci pour la reponse
j ai beau chercher
mais je ne vois pas du tout ou je dois aller modifier cela
moi et le php c est limite ...
mais je progresse a chaque fois

T'as besoin d'aide pour faire ton site (la partie php) ???

non tout est fonctionel merci c est gentil
il ne me reste plus que cette recuperation du mot de passe qui ne fonctionne pas

D'accord, bonne chance. Je ne m'y connais pas beaucoup en envoi de mail.

ah ok merci
je vais attendre de l aide d un autre membre
encore merci

Bon après-midi.

merci
bon apres midi a toi aussi

qu'elle aide ?
la doc n'est pas assez clair avec ses exemples ?

merci pour la reponse
ah oui tout y est ...
sauf que cela chez moi ca ne fonctionne pas

je recois bien le message comme quoi le mail a ete envoye
**Récupération du mot de passe
Retour à l'accueil

Si votre mail est inscrit, vous allez recevoir un mail contenant un lien à cliquer afin de recevoir un nouveau mot de passe.**

mais rien dans ma boite mail

contrairement à ce que tu penses, je ne suis pas un devin.
donc j'ai besoin de voir le nouveau code

bonsoir
non je suis deja bien content que l on puisse m aider
le code n a pas changer

<?php
    /*************************
    *  Page: mot-de-passe-oublie.php
    *  Page encodée en UTF-8
    **************************/
//configuration pour la connexion SQL:
$SQL['host']="localhost";//serveur
$SQL['user']="root";//nom d'utilisateur
$SQL['pass']="";//pass
$SQL['base']="nom_de_la_base_de_donnees";//nom de la base de données
?><!DOCTYPE HTML>
<html>
    <head>
        <title>Script espace membre</title>
    </head>
    <body>
        <h1>Récupération du mot de passe</h1>
        <a href="./">Retour à l'accueil</a>

        <?php
        if(isset($_GET['code'],$_GET['mail'])){
            //un lien est cliqué dans un mail, on recherche si le code et le mail correspondent à une ligne dans la table "recup_mdp"
            $Code=htmlentities($_GET['code'],ENT_QUOTES,"UTF-8");
            $Mail=htmlentities($_GET['mail'],ENT_QUOTES,"UTF-8");
            $mysqli=mysqli_connect($SQL['host'],$SQL['user'],$SQL['pass'],$SQL['base']);
            if(!$mysqli) {
                echo "Erreur connexion BDD";
                //Dans ce script, je pars du principe que les erreurs ne sont pas affichées sur le site, vous pouvez donc voir qu'elle erreur est survenue avec mysqli_connect_error(), pour cela décommentez la ligne suivante:

                //echo "<br>Erreur retournée: ".mysqli_connect_error();

            } else {
                $req=mysqli_query($mysqli,"SELECT * FROM recup_mdp WHERE code='$Code' AND mail='$Mail'");
                if(mysqli_num_rows($req)==1){
                    //on génère un nouveau pass (de 5 caractères) et on lui envoi:
                    $NouveauPass=substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"),0,5);
                    //on modifie son mot de passe pour son compte
                    mysqli_query($mysqli,"UPDATE membres SET mdp='".md5($NouveauPass)."' WHERE mail='$Mail'");
                    //on ui envoi un mail avec son pass temporaire:
                    mail($Mail,"Votre nouveau mot de passe","Le nouveau mot de passe pour votre compte est: $NouveauPass (Il est vivement conseille de le modifier depuis votre espace membre)");
                    //on supprime la demande mot de passe qui est dans la table "recup_mdp":
                    mysqli_query($mysqli,"DELETE FROM recup_mdp WHERE code='$Code' AND mail='$Mail'");
                    echo "Votre nouveau pass temporaire vient d'être envoyé par mail.";
                } else {
                    echo "Lien incorrect.";
                }
            }
        } else {
            //si le formulaire est envoyé ("envoyé" signifie que le bouton submit est cliqué)
            if(isset($_POST['valider'])){
                //vérifie si le champ mail est bien rempli:
                if(empty($_POST['mail'])){
                    echo "Le champs mail n'est pas renseigné.";
                } else {
                    //tous les champs sont précisés, on regarde si le membre est inscrit dans la bdd:
                    //d'abord il faut créer une connexion à la base de données dans laquelle on souhaite regarder:
                    $mysqli=mysqli_connect($SQL['host'],$SQL['user'],$SQL['pass'],$SQL['base']);
                    if(!$mysqli) {
                        echo "Erreur connexion BDD";
                        //Dans ce script, je pars du principe que les erreurs ne sont pas affichées sur le site, vous pouvez donc voir qu'elle erreur est survenue avec mysqli_error(), pour cela décommentez la ligne suivante:

                        //echo "<br>Erreur retournée: ".mysqli_error($mysqli);

                    } else {
                        //on défini nos variables:
                        $Mail=htmlentities($_POST['mail'],ENT_QUOTES,"UTF-8");//htmlentities avec ENT_QUOTES permet de sécuriser la requête pour éviter les injections SQL, UTF-8 pour dire de convertir en ce format
                        $req=mysqli_query($mysqli,"SELECT * FROM membres WHERE mail='$Mail'");
                        //on regarde si le membre est inscrit dans la bdd:
                        //même si le membre n'existe pas, on affiche qu'un mail à été envoyé, ceci permet d'empécher les robots de voir si un mail existe ou pas dans votre base de données et de vous le dérober
                        if(mysqli_num_rows($req)!=1){
                            //mail inconnu
                        } else {
                            //mail connu, on lance la procédure d'envoi du mail pour recevoir un nouveau mdp
                            $Code=md5(rand(1,99999999));
                            mysqli_query($mysqli,"INSERT INTO recup_mdp SET code='$Code', mail='$Mail'");
                            $Lien=$_SERVER['HTTP_HOST']."/mot-de-passe-oublie.php?code=$Code&mail=$Mail";
                            mail($Mail,"Recuperation du mot de passe","Pour recevoir un nouveau mot de passe cliquez sur le lien suivant: $Lien");
                        }
                        echo "<p>Si votre mail est inscrit, vous allez recevoir un mail contenant un lien à cliquer afin de recevoir un nouveau mot de passe.</p>";
                        $TraitementFini=true;//pour cacher le formulaire
                    }
                }
            }
            if(!isset($TraitementFini)){//quand le membre sera connecté, on définira cette variable afin de cacher le formulaire
                ?>
                <br>
                <p>Remplissez le formulaire ci-dessous pour recevoir un nouveau mot de passe:</p>
                <form method="post" action="mot-de-passe-oublie.php">
                    <input type="text" name="mail" placeholder="Votre mail..." required><!-- required permet d'empêcher l'envoi du formulaire si le champ est vide -->
                    <input type="submit" name="valider" value="Recevoir un nouveau mot de passe">
                </form>
                <?php
            }
        }
        ?>
    </body>
</html>

la doc est assez clair non ?
https://www.php.net/manual/fr/function.mail.php
pour le test voici un peu d'aide

if (mail(......))
    echo "mail ok";
else
    echo "mail ko";

merci de l aide
je vais aller voir cela