Bonjour,
J'ai un problème d'encodage sur les mail envoyés automatiquement lors de l'inscription et de la réinitialisation du mot de passe.
J'obtient ceci répondre.
J'ai déjà travaillé sur des formulaires avec l'envoie d'emil automatiquement comme ceci

$res = mail($TO, utf8_decode($objet), utf8_decode($informations), $head);

Mais je n'arrive pas avec les deux fonctions email de cet espace membre, je n'arrive pas comprendre ces deux fonctions.

       public function register($db, $name, $username, $password, $email){
        $password = $this->hashPassword($password);
        $token = Str::random(60);
        $db->query("INSERT INTO users_animateur SET name = ?, username = ?, password = ?, email = ?, confirmation_token = ?", [
            $name,
            $username,
            $password,
            $email,
            $token
        ]);
        $user_id = $db->lastInsertId();
       mail($email , 'Confirmation de votre compte', "Ceci est un mail automatique, merci ne pas répondre.\nAfin de valider votre compte merci de cliquer sur ce lien\n\nhttp://www.xxxxx.com/confirm.php?id=$user_id&token=$token");
    public function resetPassword($db, $email){
        $user = $db->query('SELECT * FROM users_animateur WHERE email = ? AND confirmed_at IS NOT NULL', [$email])->fetch();
        if($user){
            $reset_token = Str::random(60);
            $db->query('UPDATE users_animateur SET reset_token = ?, reset_at = NOW() WHERE id = ?', [$reset_token, $user->id]);

           mail($_POST['email'], 'Réinitiatilisation de votre mot de passe', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://xxxxx.com/reset.php?id={$user->id}&token=$reset_token");
return $user;
        }
        return false;

Je ne vois pas ou ce fait la préparation des mails et je ne sais pas du tout comment résoudre ce problème d'encodage. Ma page est encodé en UTF-8. J'ai essayé de mettre $head mais ça ne fonctionne pas.
Merci de votre aide

7 réponses


Gaspard
Réponse acceptée

Peux-tu essayer avec ça ?

$headers .='Content-Type: text/plain; charset="utf-8"'." ";
$headers .='Content-Transfer-Encoding: 8bit';

Cordialement,
Gasp.

As-tu essayer d'écrire ton "Répondre" avec le é en html (& #233;) ce qui donnerai R& #233;pondre ?
Ou sinon insérer dans ton $header l'encodage ($headers[] = "Content-type: text/plain; charset=iso-8859-1";)
Et pour ta fonction mail(), je t'invite à lire la documentation ([http://php.net/manual/fr/function.mail.php]())

Ou alors en passant tout tes accents en caractères HTML, pour répondre :

répondre ?
Polo
Auteur

Bonjour,
Désolé pour la réponse tardive. j'ai essayé en remplaçant les accents en caractère HTML, ça ne fonctionne pas.
Je viens de regardé la documantation sur la fonction mail et ajouter un $header dans le premier envoie mail, mais ça ne fonctionne toujours pas. Peut-être mal placé ou j'ai peut-être oublié quelques chose, je ne sais pas.

<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>sans titre 2</title>
</head>

<body>

<?php
class Auth{

    private $options = [
        'restriction_msg' => "Vous n'avez pas le droit d'accéder à cette page"
    ];
    private $session;

    public function __construct($session, $options = []){
        $this->options = array_merge($this->options, $options);
        $this->session = $session;
    }

    public function hashPassword($password){
        return password_hash($password, PASSWORD_BCRYPT);
    }

    public function register($db, $name, $username, $password, $email){
        $password = $this->hashPassword($password);
        $token = Str::random(60);
        $db->query("INSERT INTO users_animateur SET name = ?, username = ?, password = ?, email = ?, confirmation_token = ?", [
            $name,
            $username,
            $password,
            $email,
            $token
        ]);
        $user_id = $db->lastInsertId();

        $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
        mail($email , 'Confirmation de votre compte', "Ceci est un mail automatique, merci ne pas répondre.\n
        Afin de valider votre compte merci de cliquer sur ce lien\n\
        nhttp://www.xxxxx.com/confirm.php?id=$user_id&token=$token", $headers);
    }

    public function confirm($db, $user_id, $token){
        $user = $db->query('SELECT * FROM users_animateur WHERE id = ?', [$user_id])->fetch();
        if($user && $user->confirmation_token == $token ){
            $db->query('UPDATE users_animateur SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?', [$user_id]);
            $this->session->write('auth', $user);
            return true;
        }
        return false;
    }

    public function restrict(){
        if(!$this->session->read('auth')){
            $this->session->setFlash('danger', $this->options['restriction_msg']);
            header('Location: login.php');
            exit();
        }
    }

    public function user(){
        if(!$this->session->read('auth')){
            return false;
        }
        return $this->session->read('auth');
    }

    public function connect($user){
        $this->session->write('auth', $user);
    }

    public function connectFromCookie($db){
        if(isset($_COOKIE['remember']) && !$this->user()){
            $remember_token = $_COOKIE['remember'];
            $parts = explode('==', $remember_token);
            $user_id = $parts[0];
            $user = $db->query('SELECT * FROM users_animateur WHERE id = ?', [$user_id])->fetch();
            if($user){
                $expected = $user_id . '==' . $user->remember_token . sha1($user_id . 'ratonlaveurs');
                if($expected == $remember_token){
                    $this->connect($user);
                    setcookie('remember', $remember_token, time() + 60 * 60 * 24 * 7);
                } else{
                    setcookie('remember', null, -1);
                }
            }else{
                setcookie('remember', null, -1);
            }
        }
    }

    public function login($db, $username, $password, $remember = false){
        $user = $db->query('SELECT * FROM users_animateur WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL', ['username' => $username])->fetch();
        if(password_verify($password, $user->password)){
            $this->connect($user);
            if($remember){
                $this->remember($db, $user->id);
            }
            return $user;
        }else{
            return false;
        }
    }

    public function remember($db, $user_id){
        $remember_token = Str::random(250);
        $db->query('UPDATE users_animateur SET remember_token = ? WHERE id = ?', [$remember_token, $user_id]);
        setcookie('remember', $user_id . '==' . $remember_token . sha1($user_id . 'ratonlaveurs'), time() + 60 * 60 * 24 * 7);

    }

    public function logout(){
        setcookie('remember', NULL, -1);
        $this->session->delete('auth');
    }

    public function resetPassword($db, $email){
        $user = $db->query('SELECT * FROM users_animateur WHERE email = ? AND confirmed_at IS NOT NULL', [$email])->fetch();
        if($user){
            $reset_token = Str::random(60);
            $db->query('UPDATE users_animateur SET reset_token = ?, reset_at = NOW() WHERE id = ?', [$reset_token, $user->id]);
            mail($_POST['email'], 'Réinitiatilisation de votre mot de passe', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://www.xxxxx.com/reset.php?id={$user->id}&token=$reset_token");
            return $user;
        }
        return false;
    }

    public function checkResetToken($db, $user_id, $token){
        return $db->query('SELECT * FROM users_animateur WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)', [$user_id, $token])->fetch();
    }

}
?>

</body>

</html>
Polo
Auteur

Bonjour,
je viens de tester le headers ci dessus, ça fonctionne, plus de répondre, les accents apparaissent correctement.
Voici les codes des deux fonctions mail.
Le mail envoyé pour la confirmation du compte

public function register($db, $name, $username, $password, $email){
        $password = $this->hashPassword($password);
        $token = Str::random(60);
        $db->query("INSERT INTO users_animateur SET name = ?,username = ?, password = ?, email = ?, confirmation_token = ?", [
            $name,
            $username,
            $password,
            $email,
            $token
        ]);
        $user_id = $db->lastInsertId();

        $headers .='Content-Type: text/plain; charset="utf-8"'." ";
        $headers .='Content-Transfer-Encoding: 8bit';

        mail($email, 'Confirmation de votre compte', "Ceci est un mail automatique, merci de ne pas répondre.
        Afin de valider votre compte merci de cliquer sur ce lien\n\n
        http://www.xxxxx.com/confirm.php?id=$user_id&token=$token", $headers);
    }

Le mail envoyé pour la réinitialisation du mot de passe

public function resetPassword($db, $email){
        $user = $db->query('SELECT * FROM users_animateur WHERE email = ? AND confirmed_at IS NOT NULL', [$email])->fetch();
        if($user){
            $reset_token = Str::random(60);
            $headers .='Content-Type: text/plain; charset="utf-8"'." ";
            $headers .='Content-Transfer-Encoding: 8bit';
            $db->query('UPDATE users_animateur SET reset_token = ?, reset_at = NOW() WHERE id = ?', [$reset_token, $user->id]);
            mail($_POST['email'], 'Réinitiatilisation de votre mot de passe', 
            "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\n
            http://www.xxxxx.com/reset.php?id={$user->id}&token=$reset_token", $headers);
            return $user;
        }
        return false;
    }

Merci à tous pour votre aide, pas simple cesz problèmes d'encodage

Heureux d'avoir pu t'aider.

Bonne journée !
Gasp.

Polo
Auteur

Encore merci, bonne journée à toi également