Problème envoi email de vérification: problème MAMP?

Par bertrand bovet, il y a 6 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'ai un formulaire d'inscription qui fonctionne parfaitement tout va bien dans la bdd...mais!
[code]
<?php require 'inc/function.php';

if(!empty($_POST)){
$errors=array();
require 'inc/db.php';

if(empty($_POST['username']) || !preg_match('/^[a-zA-z0-9_]+$/', $_POST['username'])){
    $errors['username'] = 'Le pseudo est requis';
}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à utilisé pour un autre compte';
    }
}

if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
    $errors['email'] = "Cet 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['password'] = "Vous devez saisir un mot de passe valide";
}

if(empty($errors)){

$req = $pdo->prepare ("INSERT INTO users set username = ?, email = ?, password = ?, confirmation_token = ?");
$password = password_hash($_POST['password'], PASSWORD_ARGON2ID);
$token = str_random(60);
$req->execute([$_POST['username'], $_POST['email'], $password, $token]);

mail($_POST['email'], 'Confirmation de compte', "Afin de valider votre compte, veuillez cliquer sur le lien\n\nhttp://localhost:8888/register.php?id=$user_id&token=$token");
$user_id = $pdo->lastInsertId();
exit('Un mail vous a été envoyé');
} 

}
?>

<!DOCTYPE html>
<html>
<head>
<title>Inscription</title>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<link href='http://fonts.googleapis.com/css?family=Lato' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="css/inscription.css">
<script src="js/script.js"></script>
<link href="https://fonts.googleapis.com/css?family=Indie+Flower&display=swap" rel="stylesheet">
<script src="https://kit.fontawesome.com/5c489d9098.js" crossorigin="anonymous"></script>
</head>
<body>
<!--FORMULAIRE-->

     <div class="wrapper">
        <div class="inner">
            <img src="images/image-1.png" alt="" class="image-1">
            <form action="" method="POST">

                <h3>Nouveau compte?</h3>

                <?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; ?>

                <div class="form-holder">
                    <span class="lnr lnr-user"></span>
                    <input type="text" name="username" class="form-control" placeholder="Pseudo">
                </div>
                <div class="form-holder">
                    <span class="lnr lnr-envelope"></span>
                    <input type="email" name="email"  class="form-control" placeholder="Email">
                </div>
                <div class="form-holder">
                    <span class="lnr lnr-lock"></span>
                    <input type="password" name="password"  class="form-control" placeholder="Mot de passe">
                </div>
                <div class="form-holder">
                    <span class="lnr lnr-lock"></span>
                    <input type="password" name="password_confirm"  class="form-control" placeholder="Confirmer le mot de passe">
                </div>
                <button type="submit    ">
                    <span>S'inscrire</span>
                </button>
                <button type="button" onclick="window.location.href = 'index.html';"> 
                    <span>Accueil</span>
                </button>
            </form>
            <img src="images/image-2.png" alt="" class="image-2">
        </div>

    </div>

</body>
<footer>
</footer>
</html>
[code]
[code]

<?php
function debug($variable){
echo '<pre>' . print_r($variable, true) . '</pre>';
}

function str_random($length){
$alphabet = "0123456789AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn";
return substr(str_shuffle(str_repeat($alphabet, $length)), 0, $length);
}
[code]
[code]
<?php
$pdo = new PDO('mysql:dbname=members;host=localhost', 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
[code]

Ce que j'obtiens

Je ne reçois aucun mail sur mes boites! Même dans les spams....je pense à un problème de configuration de MAMP si quelqu'un pourrait me filer un tuyau...HELP!
Merci :)

25 réponses

Carouge10, il y a 6 ans

Bonjour,
Tu ne tests pas le retour de la fonction mail pour savoir si le mail est bien parti
Ensuite il te manque le headers de la fonction mail (certes optionnels mais beaucoup de boîte maintenant le demande) (cf la doc php.net)

bertrand bovet, il y a 6 ans

je la test avec le exit("Un email vous à été envoyé") non? Et j'ai essayé avec le header de la fonction mais cela ne change rien...après je suis le tuto de grafikart...lui ca fonctionne pas moi...

Carouge10, il y a 6 ans

le tuto n'est pas d'aujourd'hu non plus, ça évolue.
Non exit ne test rien du tout, il arrête le script avec un formulaire

bertrand bovet, il y a 6 ans

ok!!! je pensais que ca testait l´envoi...je vais me renseigner alors...merci en tout cas!

bertrand bovet, il y a 6 ans

Bonjour,
J'ai toujours le même problème même avec le "headers" etc...
[code]
if(empty($errors)){

    $req = $pdo->prepare ("INSERT INTO users SET username = ?, email = ?, password = ?, confirmation_token = ?");
    $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
    $token = str_random(60);
    $req->execute([$_POST['username'], $_POST['email'], $password, $token]);

    $user_id = $pdo->lastInsertId();
    $message = "Confirmez vôtre compte en cliquant sur le lien ci dessous:\n\nhttp://127.0.0.1/confirm.html?id=$user_id&token=$token";
    $headers =  array(
        'From' => "monmail@gmail.com",
        'Reply-To' => 'monmail@gmail.com', 
        'X-Mailer' => 'PHP/' . phpversion(7.3)
                    );
    mail($_POST['email'], $headers);

    header('Location: index.html');
    exit();
                }
            }

?>
[code]

Carouge10, il y a 6 ans

Bonjour,
Toujours pas de test sur le retour de la fonction mail,

<?php if (mail(....)) echo "envoyé"; else echo "pas envoyé";

Et tu ne mets ni objet, ni message dans ton mail ?

bertrand bovet, il y a 6 ans

M**de! Je veux faire trop vite je crois que mon cerveau surchauffe en cette période de confinement...Je teste ça tout à l'heure...merci Carouge! PS:Tu es de suisse(rapport à ton pseudo)?

Carouge10, il y a 6 ans

Non du tout.
Belle ville en tout cas.

bertrand bovet, il y a 6 ans

:) bon le message n'est pas envoyé il me dit d'upgrade mysql...
[Warning] InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name table_name. Please run mysql_upgrade

bertrand bovet, il y a 6 ans

Bonjour,
J'ai beau chercher je ne comprends pas! Il m'affiche envoyé mais rien sur l'adresse mail...
[code]

if(empty($errors)){

    $req = $pdo->prepare ("INSERT INTO users SET username = ?, email = ?, password = ?, confirmation_token = ?");
            $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
            $token = str_random(60);
            $req->execute([$_POST['username'], $_POST['email'], $password, $token]);

            $user_id = $pdo->lastInsertId();
            $sujet = "Confirmation de votre inscription";
            $message = "Confirmez vôtre compte en cliquant sur le lien ci dessous:\n\nhttp://localhost/confirm.php?id=$user_id&token=$token";
            $headers = "From: monmail@gmail.com";
                    if (mail($user_id, $sujet, $message, $headers))
                        echo "envoyé";
                    else
                        echo "pas envoyé";
                            exit();
                }
            }

[code]

J'ai regardé si ça pouvait venir de MAMP, modifié le php.ini mais rien ne change...à part qu'il me dit bien que le mail a été envoyé...:(

Carouge10, il y a 6 ans

Je crois que tu as besoin de repos.
Qu'elle est le 1er paramètre de la fonction mail ?

bertrand bovet, il y a 6 ans

Je crois aussi oui mais quand j'ai quelquechose en tête...je l'ai pas ailleurs...
L1er paramètre est le dernier email envoyé à la bdd

Carouge10, il y a 6 ans

Alors un var_dump($user_id) juste avant le if, le confirmera....
Je me demande d'ailleurs pourquoi il y a "id" dans cette variable....

bertrand bovet, il y a 6 ans

string(1) "4" envoyé -> voilà ce que retourne var_dump
et j'ai changé $user_id par $user, c'est mieux?

Carouge10, il y a 6 ans

Donc "4" n'est pas un email....
Je ne sais pas ce que contient $user. Pourquoi ne pas utiliser $_POST['email'] ? ça ne serai l'email de la personne qui vient de s'inscrire ?

bertrand bovet, il y a 6 ans

J'ai essayé de simplifier mon code sans envoyé de "token"...juste envoyer un mail de confirmation de création de compte...rien à faire je ne reçois rien...

Carouge10, il y a 6 ans

Code ?
Tu as consulté les spams ?
Tu as consulté les logs de Mamp ?

bertrand bovet, il y a 6 ans

une erreur dans le mysql_error_log.err-> InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name table_name. Please run mysql_upgrade
Voila voila...et rien dans les spams...

bertrand bovet, il y a 6 ans

Alors je reçois le mail mais uniquement sur ma boîte mail free! La freebox doit etre en cause je vais checker à ce niveau là...

Carouge10, il y a 6 ans

Et sur quel autre adresse tu ne reçois pas ?

bertrand bovet, il y a 6 ans

gmail, hotmail...

Carouge10, il y a 6 ans

gmail, je galère aussi

bertrand bovet, il y a 6 ans

ca me rassure! enfin c´est bizarre...mais ca marche si je ne mets pas le token dans l´envoi si je mets le token je be recois rien...a la limite je m´en passerai pas grave...

Carouge10, il y a 6 ans

Tourne toi sur "phpmailer", qui t'aidera à mettre en forme et aura plus de chanse de passer

bertrand bovet, il y a 6 ans

okay merci m´sieur j´ai vu ca mais n´ai pas pris le temps de regarder...merci pour tout en tout cas