Résolu

Problème envoie de mail / confirmation par mail

Bonjour, je suis entrain de coder, recoder et ainsi de suite un site pour cela je m'aide des article déjà présent sur ce site et les adaptent selon mon besoin seulement tout marche parfaitement pour instant sauf que j'arrive vers article Valider son compte avec un mail. Je fais comme se qui et montré je recharge la page et la sa me mais HTTP ERROR 500

sans aucune explication ou autre du coup je supprime mon fichier je télécharge la source je modifie juste 2/3 information mais rien y fait toujours le même


ps: je tien à préciser je fait tout via mon hébergeur qui propose lui un gestionnaire de fichier + éditeur de code.

ps 2: j'ai créer un fichier .htaccess avec ce code

ps 3: c'est mon premier topic que je créer donc je sais pas trop comment procéder pour expliquer mon problèmes


Fichier .htaccess


# On autorise de renommer les pages
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f
# On peut enlever le .php et renommer les pages comme on le souhaite
RewriteRule ^([^\.]+)$ $1.php [L]


Qui me permet de retirer les extension style .php


Page register.php


<?php
    session_start();


    include('config/configDB.php'); // Fichier PHP contenant la connexion à votre BDD


    // S'il y a une session alors on ne retourne plus sur cette page
    if (isset($_SESSION['id'])){
        header('Location: index'); 
        exit;
    }


    // Si la variable "$_Post" contient des informations alors on les traitres
    if(!empty($_POST)){
        extract($_POST);
        $valid = true;


        // On se place sur le bon formulaire grâce au "name" de la balise "input"
        if (isset($_POST['forget'])){


			$pseudo  = htmlentities(trim($pseudo)); // On récupère le nom
            $nom  = htmlentities(trim($nom)); // On récupère le nom
            $prenom = htmlentities(trim($prenom)); // on récupère le prénom
            $mail = htmlentities(strtolower(trim($mail))); // On récupère le mail
            $mdp = trim($mdp); // On récupère le mot de passe 
            $confmdp = trim($confmdp); //  On récupère la confirmation du mot de passe


			//  Vérification du pseudo
            if(empty($pseudo)){
                $valid = false;
                $er_nom = ("Le nom d' utilisateur ne peut pas être vide");
            }
			
            //  Vérification du nom
            if(empty($nom)){
                $valid = false;
                $er_nom = ("Le nom d' utilisateur ne peut pas être vide");
            }       


            //  Vérification du prénom
            if(empty($prenom)){
                $valid = false;
                $er_prenom = ("Le prenom d' utilisateur ne peut pas être vide");
            }       


            // Vérification du mail
            if(empty($mail)){
                $valid = false;
                $er_mail = "Le mail ne peut pas être vide";


                // On vérifit que le mail est dans le bon format
            }elseif(!preg_match("/^[a-z0-9\-_.]+@[a-z]+\.[a-z]{2,3}$/i", $mail)){
                $valid = false;
                $er_mail = "Le mail n'est pas valide";


            }else{
                // On vérifit que le mail est disponible
                $req_mail = $DB->query("SELECT mail FROM utilisateur WHERE mail = ?",
                    array($mail));


                $req_mail = $req_mail->fetch();


                if ($req_mail['mail'] <> ""){
                    $valid = false;
                    $er_mail = "Ce mail existe déjà";
                }
            }


            // Vérification du mot de passe
            if(empty($mdp)) {
                $valid = false;
                $er_mdp = "Le mot de passe ne peut pas être vide";


            }elseif($mdp != $confmdp){
                $valid = false;
                $er_mdp = "La confirmation du mot de passe ne correspond pas";
            }


            // Si toutes les conditions sont remplies alors on fait le traitement
            if($valid){


                $mdp = crypt($mdp, "$6$rounds=5000$5c724e4558753c343a335d43635c7e24$");


                $date_creation_compte = date('Y-m-d H:i:s');


                $token = bin2hex(random_bytes(12));




                // On insert nos données dans la table utilisateur
                $DB->insert("INSERT INTO utilisateur (pseudo, nom, prenom, mail, mdp, date_creation_compte, token) 
                    VALUES 
                    (?, ?, ?, ?, ?, ?)", 
                    array($pseudo, $nom, $prenom, $mail, $mdp, $date_creation_compte, $token));


                $req = $DB->query("SELECT *
                  FROM utilisateur
                  WHERE mail = ?",
                  array($mail));
                  
                $req = $req->fetch();
                 
                $mail_to = $req['mail']; 
                 
                //=====Création du header de l'e-mail.
                $header = "From: no-reply <no-reply@wolfteam.fr>\n";
                $header .= "MIME-version: 1.0\n";
                $header .= "Content-type: text/html; charset=utf-8\n";
                $header .= "Content-Transfer-ncoding: 8bit";
                //=======
                 
                //=====Ajout du message au format HTML          
                $contenu = '<p>Bonjour ' . $req['nom'] . ',</p><br>
                   <p>Veuillez confirmer votre compte <a href="https://wolfteam.fr/conf.php?id=' . $req['id'] . '&token=' . $token . '">Valider</a><p>';
                                    
                mail($mail_to, 'Confirmation de votre compte', $contenu, $header);




                header('Location: index');
                exit;
            }
        }
    }
?>
<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Inscription</title>
    </head>


    <body>      
        <div>Inscription</div>
        <form method="post">


			<?php
                // S'il y a une erreur sur le nom alors on affiche
                if (isset($er_pseudo)){
                ?>
                    <div><?= $er_pseudo ?></div>
                <?php   
                }
            ?>
            <input type="text" placeholder="Votre pseudo" name="pseudo" value="<?php if(isset($pseudo)){ echo $pseudo; }?>" required>
			
            <?php
                // S'il y a une erreur sur le nom alors on affiche
                if (isset($er_nom)){
                ?>
                    <div><?= $er_nom ?></div>
                <?php   
                }
            ?>
            <input type="text" placeholder="Votre nom" name="nom" value="<?php if(isset($nom)){ echo $nom; }?>" required>   


            <?php
                if (isset($er_prenom)){
                ?>
                    <div><?= $er_prenom ?></div>
                <?php   
                }
            ?>
            <input type="text" placeholder="Votre prénom" name="prenom" value="<?php if(isset($prenom)){ echo $prenom; }?>" required>   


            <?php
                if (isset($er_mail)){
                ?>
                    <div><?= $er_mail ?></div>
                <?php   
                }
            ?>
            <input type="email" placeholder="Adresse mail" name="mail" value="<?php if(isset($mail)){ echo $mail; }?>" required>


            <?php
                if (isset($er_mdp)){
                ?>
                    <div><?= $er_mdp ?></div>
                <?php   
                }
            ?>
            <input type="password" placeholder="Mot de passe" name="mdp" value="<?php if(isset($mdp)){ echo $mdp; }?>" required>
            <input type="password" placeholder="Confirmer le mot de passe" name="confmdp" required>


                <button type="submit" name="forget">Envoyer</button>


        </form>
    </body>
</html>


Page conf.php


<?php
  session_start();
  require('config/configDB.php');
 
 
  if (isset($_SESSION['id'])){
    header('Location: index.php');
    exit;
  }
 
 
  $id = (int) $_GET['id'];
  $token = (String) htmlentities($_GET['token']);
  
  if(!isset($id)){
    $err_mess = "Le lien est erroné";
 
 
  }elseif(!isset($token)){
    $err_mess = "Le lien est erroné";
  }
 
 
  if(true){
    $req = $DB->query("SELECT id 
      FROM utilisateur WHERE id = ? AND token = ?",
      array($id, $token));
 
 
    $req = $req->fetch();
 
 
    if(!isset($req['id'])){
      $err_mess = "Le lien n'est plus valide";
    }else{
      $DB->insert("UPDATE utilisateur SET token = NULL, confirmation_token = ? WHERE id = ?",
      array(date('Y-m-d H:i:s'), $req['id']));
 
 
      $info_mess = "Votre compte a bien été validé";
    }
  }
 
 
  if(isset($err_mess)){
    echo $err_mess;
  }
 
 
  if(isset($info_mess)){
    echo $info_mess;
  }
  
  ?>
<!DOCTYPE html>
<html>
  <head>
    <title>Validation mail</title>
  </head>
  <body>
    <a href="index">Accueil</a>
  </body>
</html>
Cette pub permet au site de vivre ...

43 commentaires

Le problème semble réglée je reçois bien le mail maintenant alors que je n'est fait aucune modif du code j'ai juste retester depuis pour voir et cela marche correctement donc je peux mettre le topic en résolu


Merci encore pour votre aide

Re:


Pour le premier message d'erreur, il faut que tu déclares ta variable "rounds"

Pour ton deuxième message d'erreur, regarde ce topic 😉

Pour ton dernier message d'erreur, tu as une erreur de syntaxe dans ta requête

Re; petit udapte en mettant en commentaire


la redirection :


        //header('Location: ../login');
        //exit;


j'ai 3 erreur qui s'affiche :


Notice: Undefined variable: rounds in /home/kldhfol/www/pages/register.php on line 88


Deprecated: crypt(): Supplied salt is not valid for DES. Possible bug in provided salt format. in /home/kldhfol/www/pages/register.php on line 88


Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' FROM utilisateur WHERE mail = 'test@gmail.com'' at line 2 in /home/kldhfol/www/config/configDB.php on line 29


Mais aucune erreur smtp comparé en local (se qui et normal vu que j'ai pas configuré envoie de mail en local et selon moi la 3eme erreur a l'air pluto interessant mais j'ignore comment la réglé

Re: @Jerem971


se que je voulais dire par manuellement c'est rentrée le lien(tout en mettant les bonne information) que les utilisateur sont censé cliqué sur le mail afin de confirmer le compte


ce lien plus précisément :

  

<p>Veuillez confirmer votre compte <a href="https://monadress/conf?id=' . $req['id'] . '&token='      . $token . '">Valider</a><p>';

Re:


@raphael-2228, que veux-tu dire par "manuellement" ? 🤔

Je vient de tester la confirmation email manuellement et elle marche parfaitement j'ai du comprendre un peut sont fonctionnement pour faire sa sinon je reçois toujours pas le mail j'ai essayer de remplacer la variable  $mail_to par ma propre email mais sa change rien du tout

Bonjour @Clouder, j'avez déjà tester et retester  regarde plus bas dans la conversation et cela marcher bien j'ai suivi ton Tuto sur la modification mot de passe marche parfaitement le Tuto pour la page de contact aussi c'est le seul Tuto que ta pas fait en vidéo (coincidence je pense pas) qui marche pas ou du moins reçois aucun mail j'avez essayer de mettre un echo au niveau du mail() sauf que à chaque sa mettait Erreur http 500

@raphael-2228, super !


Pour ton dernier problème celui de l'envoi de ton mail essaie de partir d'une page vierge et tu mets uniquement la fonction mail de php avec comme objet et message "test" et comme destinataire ton mail.

Ok merci tout mes problème sont résolu hormis en ce qui concerne la confirmation par mail/envoie

donc je pense pouvoir m'être en résolu

@raphael-2228,


Pour mettre les dates en français je fais comme ça :


<?php
setlocale(LC_TIME, "fr_FR.UTF-8");
					
$date_du_jour = strftime("%d", strtotime($req['ma_date'])) . ' ' . ucfirst(strftime("%B", strtotime($req['ma_date']))) . '  ' . strftime("%Y à %H:%M", strtotime($req['ma_date']));


N'hésite pas à regarder ce qu'offre la fonction strftime


Et une autre comment faire pour que sa récupère que les 4 derniers articles car pour instant sa m'affiche tout


Pour afficher un nombre connu d'enregistrement tu dois utiliser l'instruction LIMIT en SQL


Exemple :


SELECT *
FROM utilisateur 
WHERE age > 18
LIMIT 4


Avec la requête au-dessus tu afficheras 4 enregistrements au maximum.

Cette pub permet au site de vivre ...