Bonjour la communauté en espérant que vous aller bien.
Je travaille sur un espace memebre rencontre une erreur que je comprend pas
Je rencontre cette erreur.

mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()

Mon code

 mail(
            $_POST['email'],
            "Confirmation de votre compte",
            "Afin de valider votre compte merci de clique sur ce lien\n\nhttp://localhost:8000/confirm/confirm.php?id=$user_id&token=$token"
        );

Mon fichier php.ini

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

Merci de m'aider svp...

4 réponses


popotte
Réponse acceptée

Hello

Alors pour commencer le port n'est pas bon, il faut mettre 1025 au lieux de 25

Ensuite il faut lancer le programme Mailhog (Sur windows tu aura une console qui s'ouvrira, suffit de la réduire et de l'ignorer, c'est Mailhog)

Et en principe ça devrait être bon, tu auras access à tes mails sur 127.0.0.1:8025

Si tu n'as pas encore mailhog, ça se passe ici: https://github.com/mailhog/MailHog/releases/v1.0.0

Tu prends la version windows amd64 si tu as windows

Si tu es sur mac le telechargement se fait avec Homebrew brew update && brew install mailhog

Et le lancement de mailhog se fait en tapant mailhog sur ton terminal

gillesr
Réponse acceptée

Bonjour,

C'est parceque ta variable $user n'est pas un objet mais un tableau.
Essaye de remplacer :


$user = $req->fetch();

par :


$user = $req->fetch(PDO::FETCH_OBJ);

Merci de m'avpor repondu, mais j'ai puis regler ce probleme.
Mais je rencontre une autre erruer que je comprend pas, je recois l'email sur MailDev, les données s'enregistre en base
Je sais pas si c'est probleme de lien
voila l'erreur

Trying to get property 'confirmation_token' of non-object

Mon routeur

class Router
{
    /**
     * @var string
     */
    private $viewPath;

    /**
     * @var AltoRouter
     */
    private $router;

    public function __construct(string $viewPath)
    {
        $this->viewPath = $viewPath;
        $this->router = new \AltoRouter();
    }

    public function match(string $url, string $view, ?string $name = null): self
    {
        $this->router->map('POST|GET', $url, $view, $name);

        return $this;
    }

    public function post(string $url, string $view, ?string $name = null): self
    {
        $this->router->map('POST', $url, $view, $name);

        return $this;
    }

    public function get(string $url, string $view, ?string $name = null): self
    {
        $this->router->map('GET', $url, $view, $name);

        return $this;
    }

    public function url(string $name, array $params = [])
    {
        return $this->router->generate($name, $params);
    }

    public function run(): self
    {
        $match = $this->router->match();
        $view = $match['target'];
        $params = $match['params'];
        $router = $this;
        ob_start();
        require $this->viewPath . DIRECTORY_SEPARATOR . $view . '.php';
        $content = ob_get_clean();
        require $this->viewPath . DIRECTORY_SEPARATOR . 'layouts/default.php';

        return $this;
    }
}

Page index

$router = new App\Router(dirname(__DIR__) . '/views');
$router
    ->match('/', 'auth/login', 'login')
    ->match('/membre', 'auth/register', 'register')
    ->get('/confirm', 'confirmation/confirm', 'confirm')
    ->match('/membre/admin', 'admin/account', 'account')
    ->run();

Page register

if (empty($errors)) {
        $url = $router->url("login");
        $urlConfirmation = $router->url('confirm');
        $req = $pdo->prepare("
            INSERT INTO users 
            SET username = ?, 
            password = ?, 
            email = ?, 
            confirmation_token = ?
        ");
        $password = password_hash($_POST['password'], PASSWORD_BCRYPT, ["cost" => $cost]);
        $token = Text::str_random(60);
        $req->execute([$_POST['username'], $password, $_POST['email'], $token]);
        $user_id = $pdo->lastInsertId();
        mail(
            $_POST['email'],
            "Confirmation de votre compte",
            "Afin de valider votre compte merci de clique sur ce lien\n\n$urlConfirmation?id=$user_id&token=$token"
        );
        header('Location: ' . $url);
        exit();
    }

Page Confirm

use App\Db;

$user_id = $_GET['id'];
$token = $_GET['token'];
$pdo = Db::getPDO();

$req = $pdo->prepare('SELECT confirmation_token FROM users WHERE id = ?');
$req->execute([$user_id]);
$user = $req->fetch();

if ($user && $user->confirmation_token == $token) {
    $url = $router->url("account");
    session_start();
    $pdo->prepare(
        "
        UPDATE users 
        SET confirmation_token = NULL, 
        confirmed_at = NOW() WHERE id = ?"
    )->execute([$user_id]);
    $_SESSION['auth'] = $user;
    header('Location: ' . $url);
} else {
    die("Pas ok");
}

Merci de m'aider svp.

Merci, merci & merci