Bonjour,

Voila je rencontre un petit problème avec mon code (celui de grafikart sur la creation d'un compte utilisateur) depuis plusieurs jours déjà.

je voudrais remplacer la fonction mail native de php par l'envoi avec php mailer
voici le code dans le fichier register.php :

<?php require 'inc/header.php'; 
require_once 'libs/PHPMailer/PHPMailerAutoload.php';

?>
<?php
if(!empty($_POST)) {

    $errors = array();
    require_once 'inc/db.php';

    if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])) {
        $errors['username'] = "Votre pseudo n'est pas valide (alphanumérique)";
    } else {
        $req = $pdo->prepare('SELECT id FROM users WHERE username = ?');

        $req->execute([$_POST['username']]);

        $user = $req->fetch();
        if($user){
            $errors['username'] = 'Ce pseudo est déjà pris';
        } 
    }

    if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
        $errors['email'] = "Votre adresse email n'est pas valide";
    } else {
        $req = $pdo->prepare('SELECT id FROM users WHERE email = ?');

        $req->execute([$_POST['email']]);

        $user = $req->fetch();
        if($user){
            $errors['email'] = 'Cet email est déjà utilisé pour un autre compte';
        }
        } 

    if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm'])  {
        $errors['email'] = "Vous devez entrer un mot de passe valide";
    }

   if(empty($errors)){  

     $req = $pdo->prepare("INSERT INTO users SET username = ?, password = ?, email = ?, confirmation_token = ?");

     $password = password_hash($_POST['password'], PASSWORD_BCRYPT);

     $token = str_random(60);

     $req->execute([$_POST['username'], $password, $_POST['email'], $token]);

     $user_id = $pdo->lastInsertId();

// voici la partie qui fait problème
     $mail = new PHPMailer;
     $mail->isSMTP();
     $mail->CharSet = 'UTF-8';
     $mail->SMTPDebug = 3;
     $mail->Debugoutput = 'html';
     $mail->Host = '####';
     $mail->Port = 25;
     $mail->SMTPSecure = 'ssl';
     $mail->SMTPAuth = true;
     $mail->Username = "######";
     $mail->Password = "######";
     $mail->setFrom('#######', '#####');
     $mail->AddAddress($_POST['email'], $_POST['username']);

     $mail->isHTML(true);
     $mail->Subject = 'Confirmation de votre compte';
     $mail->MsgHTML("Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://localhost/compte/confirm.php?id=$user_id&token=$token");

     $mail->AltBody = 'Ceci est un corps de message en HTML / This is a HTML message body';
     if($mail->send()) {
    echo 'Message envoye !';
} else {
    echo $mail->ErrorInfo;

}   

     header('Location: login.php');

     exit();

}

}

?>

<h1>S'inscrire</h1>

<?php if(!empty($errors)): ?>
<div class="alert alert-danger">

  <p> Vous n'avez pas rempli le formulaire correctement</p>
  <ul>
    <?php foreach($errors as $error): ?>
       <li><?= $error; ?></li>

    <?php endforeach; ?>
  </ul> 
</div>
<?php endif; ?>

<form action="" method="POST">

  <div class="form-group">
    <label for="">Pseudo</label>
    <input type="text" name="username" class="form-control" />
  </div>

  <div class="form-group">
    <label for="">Email</label>
    <input type="text" name="email" class="form-control"/>
  </div>

  <div class="form-group">
    <label for="">Mot de passe</label>
    <input type="password" name="password" class="form-control"/>
  </div>

   <div class="form-group">
    <label for="">Confirmer mot de passe</label>
    <input type="password" name="password_confirm" class="form-control"/>
  </div>

    <button type="submit" class="btn btn-primary">M'inscrire</button>

</form>

<?php require 'inc/footer.php'; ?>```

ce que je voudrais obtenir c'est que le mail soit envoyé avec le lien d'activation afin que l'utilisateur puisse activer son compte

lorsque j'envoi le formulaire je suis redirigé vers la page login.php mais je ne reçois pas le mail dans la boîte .
je vous demande ainsi de bien vouloir me donner un coup de pouce afin que je puisse à nouveau me relancer. cordialement

3 réponses


Cyrille Mbia
Auteur
Réponse acceptée

bonjour et merci pour m'avoir répondu...effectivement quand j'enlève le header location un message d'erreur s'affiche. celui ci :
Connection: opening to ssl://####.cm:25, timeout=300, options=array ()
SMTP ERROR: Failed to connect to server: (0)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

et je me suis rendu compte que c'était mes paramètres smtp j'ai corrigé et tout fonctionne merci.

pour ta question je sais pas si j'ai bien compris. pour mettre un code il faut mettre au début et également a la fin ces symboles comme ceci:
#ici tu mets ton code

Bonsoir,

Une partie de ton code m'intrigue :
[code]
if($mail->send()) {
echo 'Message envoye !';
} else {
echo $mail->ErrorInfo;
}

header('Location: login.php');
[/code]

Normalement pour qu'un header location fonctionne, il ne faut aucune sortie écran avant celui-ci. Pourtant tu dis d'afficher soit 'Message envoye !' soit $mail->ErrorInfo.
Or tu dis que tu es bien redirigé. Selon moi $mail->send() est à false et $mail->ErrorInfo est vide, ce qui permet que le header location fonctionne.

As-tu tenté d'enlever le header location pour voir si quelque chose s'affiche ?

PS : je suis nouveau ici, comment fais-tu pour faire une balise code ? merci

Bonjour,

Aaah oui je n'avais pas pensé à une erreur php. Les header location empêchent de les voir.