• Pedro Costa- Blog
  • Posts
  • Como fazer um sistema de redefinição de senha em PHP usando PHPMailer

Como fazer um sistema de redefinição de senha em PHP usando PHPMailer

Neste tutorial, vamos implementar um sistema completo de redefinição de senha em PHP. Isso inclui a instalação do Composer , a configuração do PHPMailer e a criação do sistema de recuperação de senha. Vamos usar o WAMPServer para rodar tudo localmente.

Passo 1: Configurando o Ambiente Local com WAMPServer

Primeiramente, você deve ter o WAMPServer instalado e rodando no seu computador.

  1. Instalar o WAMPServer :

    • Se você ainda não tem o WAMPServer instalado, consulte nosso Guia Completo de Instalação do WAMPServer .

    • Após a instalação, certifique-se de que o WAMPServer está rodando corretamente (o ícone na bandeja do sistema deve estar verde).

  2. Crie uma pasta de projeto :

    • Navegue até a pasta C:\wamp64\www\e crie uma nova pasta para o projeto. Vamos chamá-la de redefinicao_senha.

Passo 2: Instalando o Composer

O Composer é uma ferramenta de gerenciamento de dependências em PHP. Vamos usá-lo para instalar o PHPMailer , que será responsável por enviar e-mails para redefinição de senha.

  1. Baixando o Composer :

  2. Configurando o Composer :

    • Durante a instalação, o Composer pedirá que você informe o caminho do PHP. Se você estiver utilizando o WAMPServer, o caminho do PHP provavelmente será algo como:
      C:\wamp64\bin\php\php8.x.x\php.exe

    • Conclua a instalação normalmente.

  3. Verifique se o Composer está instalado corretamente :

    • Abra o Prompt de Comando ou PowerShell e digite:

      composer
  • Se o Composer estiver instalado corretamente, você verá uma lista de comandos.

Passo 3: Instalando o PHPMailer com Composer

Agora que o Composer está instalado, podemos utilizá-lo para baixar e instalar o PHPMailer.

  1. Instale o PHPMailer:

    • No Prompt de Comando ou PowerShell, navegue até a pasta do seu projeto(nesse exemplo é “redefinicao_senha“):

      cd C:\wamp64\www\redefinicao_senha
    • Execute o seguinte comando para instalar o PHPMailer:

      composer require phpmailer/phpmailer
    • O Composer irá baixar o PHPMailer e criar uma pasta chamada vendor com todas as dependências necessárias.

Terminal após instalação bem sucedida.

Dependências do PHPmailer.

Passo 4: Configurando o Banco de Dados no phpMyAdmin

Agora, vamos configurar o banco de dados que será usado para armazenar os usuários e tokens de redefinição de senha.

  1. Acesse o phpMyAdmin:

    • No navegador, vá para: http://localhost/phpmyadmin/.

    • Faça login (usuário padrão: root, senha: vazia).

  2. Crie o banco de dados:

    • No painel esquerdo, clique em Novo e crie um banco de dados chamado sistema_login.

  3. Crie a tabela de usuários:

    • Na aba SQL do banco de dados sistema_login, cole o seguinte comando SQL para criar a tabela de usuários:

CREATE TABLE `usuarios` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(100) NOT NULL,
  `senha` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);
  1. Crie a tabela para tokens de redefinição de senha:

  • Na aba SQL, cole o seguinte comando para criar a tabela onde serão armazenados os tokens de redefinição:

CREATE TABLE `password_resets` (
  `email` varchar(100) NOT NULL,
  `token` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL
);

Passo 5: Criando a Estrutura do Projeto

Com o banco de dados configurado, vamos criar os arquivos PHP necessários para implementar o sistema de redefinição de senha.

  1. Estrutura básica do projeto:

    • Dentro da pasta redefinicao_senha, crie os seguintes arquivos:

      • conexao.php (para a conexão com o banco de dados)

      • solicitar_redefinicao.php (para solicitar a redefinição)

      • redefinir_senha.php (para processar a nova senha)

      • enviar_email.php (para enviar o e-mail)

      • vendor/ (esta pasta foi criada automaticamente pelo Composer)

Passo 6: Criando o Arquivo de Conexão com o Banco de Dados

No arquivo conexao.php, adicione o código que irá gerenciar a conexão com o banco de dados:

<?php
// Conexão com o banco de dados
$servidor = "localhost";
$usuario = "root";
$senha = "";
$dbname = "sistema_login";

$conn = mysqli_connect($servidor, $usuario, $senha, $dbname);

// Verifica a conexão
if (!$conn) {
    die("Falha na conexão: " . mysqli_connect_error());
}
?>

Passo 7: Implementando a Solicitação de Redefinição de Senha

Crie o arquivo solicitar_redefinicao.php para que o usuário possa solicitar a redefinição de senha:

<?php
require 'conexao.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $email = $_POST['email'];
    
    // Verifica se o e-mail está cadastrado
    $sql = "SELECT * FROM usuarios WHERE email='$email'";
    $result = mysqli_query($conn, $sql);
    
    if (mysqli_num_rows($result) > 0) {
        // Gera o token único
        $token = bin2hex(random_bytes(50));
        $created_at = date("Y-m-d H:i:s");
        
        // Insere o token na tabela password_resets
        $sql = "INSERT INTO password_resets (email, token, created_at) VALUES ('$email', '$token', '$created_at')";
        if (mysqli_query($conn, $sql)) {
            // Envia o e-mail com o link de redefinição
            require 'enviar_email.php';
            enviarEmail($email, $token);
            echo "E-mail de redefinição enviado!";
        } else {
            echo "Erro ao processar a solicitação.";
        }
    } else {
        echo "E-mail não encontrado!";
    }
}
?>

<form method="POST" action="">
    <input type="email" name="email" placeholder="Digite seu e-mail" required>
    <button type="submit">Solicitar Redefinição</button>
</form>

Passo 8: Enviando o E-mail com PHPMailer

Agora, crie o arquivo enviar_email.php para enviar o e-mail com o link de redefinição de senha utilizando o PHPMailer:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

function enviarEmail($email, $token) {
    $mail = new PHPMailer();
    
    // Configurações do servidor SMTP
    $mail->isSMTP();
    $mail->Host = 'smtp.seudominio.com';
    $mail->SMTPAuth = true;
    $mail->Username = '[email protected]';
    $mail->Password = 'suasenha';
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;

    // Configurações do e-mail
    $mail->setFrom('[email protected]', 'Sistema de Redefinição');
    $mail->addAddress($email);
    $mail->Subject = "Redefinir sua senha";

    $mail->Body = "Clique no link para redefinir sua senha: http://localhost/redefinicao_senha/redefinir_senha.php?token=$token";
    
    if ($mail->send()) {
        echo "E-mail enviado com sucesso!";
    } else {
        echo "Erro ao enviar e-mail: " . $mail->ErrorInfo;
    }
}
?>

Aqui estão os hosts SMTP e suas configurações mais comuns para envio de e-mails com o PHPMailer ou outros sistemas de envio de e-mail:

1. Gmail

$mail->isSMTP(); 
$mail->Host = 'smtp.gmail.com'; 
$mail->SMTPAuth = true; 
mail->Username = '[email protected]'; 
$mail->Password = 'suasenha'; // Atenção: use a senha de aplicativo se a verificação em duas etapas estiver ativada 
$mail->SMTPSecure = 'tls'; // ou 'ssl' 
$mail->Port = 587; // ou 465 para 'ssl'

2. Outlook / Hotmail

$mail->isSMTP(); 
mail->Host = 'smtp.office365.com'; 
$mail->SMTPAuth = true; 
$mail->Username = '[email protected]'; 
$mail->Password = 'suasenha'; 
$mail->SMTPSecure = 'tls'; 
$mail->Port = 587;

3. Yahoo Mail

$mail->isSMTP();
$mail->Host = 'smtp.mail.yahoo.com'; 
$mail->SMTPAuth = true; $mail->Username = '[email protected]'; $mail->Password = 'suasenha'; 
$mail->SMTPSecure = 'ssl'; 
$mail->Port = 465;

Passo 9: Processando a Redefinição de Senha

Por fim, crie o arquivo redefinir_senha.php, onde o usuário poderá definir sua nova senha:

<?php
require 'conexao.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $token = $_POST['token'];
    $nova_senha = password_hash($_POST['senha'], PASSWORD_BCRYPT);
    
    // Verifica o token
    $sql = "SELECT email FROM password_resets WHERE token='$token'";
    $result = mysqli_query($conn, $sql);
    
    if (mysqli_num_rows($result) > 0) {
        $row = mysqli_fetch_assoc($result);
        $email = $row['email'];
        
        // Atualiza a senha
        $sql = "UPDATE usuarios SET senha='$nova_senha' WHERE email='$email'";
        if (mysqli_query($conn, $sql)) {
            echo "Senha redefinida com sucesso!";
            // Remove o token
            $sql = "DELETE FROM password_resets WHERE email='$email'";
            mysqli_query($conn, $sql);
        } else {
            echo "Erro ao redefinir a senha.";
        }
    } else {
        echo "Token inválido.";
    }
}
?>

<form method="POST" action="">
    <input type="hidden" name="token" value="<?php echo $_GET['token']; ?>">
    <input type="password" name="senha" placeholder="Digite sua nova senha" required>
    <button type="submit">Redefinir Senha</button>
</form>

Para que você possa testar a funcionalidade de redefinição de senha, precisaremos adicionar um usuário de teste ao banco de dados. Vamos criar um formulário simples que permitirá adicionar usuários diretamente ao banco de dados.

Passo Adicional: Criando um Formulário para Adicionar um Usuário de Teste

  1. Criando o Arquivo de Adição de Usuário

    • Dentro da pasta redefinicao_senha, crie um arquivo chamado add_usuario.php. Esse arquivo terá um formulário para adicionar um novo usuário ao banco de dados, assim você pode criar usuários de teste.

  2. Conteúdo do Arquivo add_usuario.php: 

<?php
require 'conexao.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $email = $_POST['email'];
    $senha = password_hash($_POST['senha'], PASSWORD_BCRYPT); // Criptografa a senha

    // Insere o usuário no banco de dados
    $sql = "INSERT INTO usuarios (email, senha) VALUES ('$email', '$senha')";
    
    if (mysqli_query($conn, $sql)) {
        echo "Usuário adicionado com sucesso!";
    } else {
        echo "Erro ao adicionar usuário: " . mysqli_error($conn);
    }
}
?>

<form method="POST" action="">
    <input type="email" name="email" placeholder="Digite o e-mail do usuário" required>
    <input type="password" name="senha" placeholder="Digite a senha do usuário" required>
    <button type="submit">Adicionar Usuário</button>
</form>

HORA DOS TESTES!

Passo 1: Adicionando um Usuário de Teste

Agora que temos o arquivo de adição de usuário, você pode seguir esses passos:

  1. Acesse o arquivo no navegador:

    • Abra o navegador e digite http://localhost/redefinicao_senha/add_usuario.php.

  2. Adicione um usuário de teste:

    • Preencha o formulário com um e-mail e senha.

    • Clique em "Adicionar Usuário". Isso irá adicionar o novo usuário diretamente na tabela usuarios no banco de dados.

Passo 2: Testando a Redefinição de Senha para o Usuário Adicionado

Agora que você tem um usuário de teste no banco de dados, siga os passos a seguir para testar o processo de redefinição de senha:

  1. Solicite a redefinição de senha:

    • Acesse o arquivo solicitar_redefinicao.php através do navegador:
      http://localhost/redefinicao_senha/solicitar_redefinicao.php

    • Insira o e-mail do usuário de teste que você acabou de adicionar e clique no botão para solicitar a redefinição.

  2. Verifique o e-mail:

    • O e-mail de redefinição de senha será enviado (verifique se o PHPMailer está corretamente configurado e rodando).

  3. Redefina a senha:

    • Clique no link de redefinição de senha enviado para o e-mail, e você será redirecionado para a página onde poderá definir uma nova senha.

  4. Login com a nova senha:

    • Após redefinir a senha, você pode fazer login normalmente usando o e-mail e a nova senha no seu sistema (se houver uma funcionalidade de login).

Conclusão

Esse tutorial mostra como implementar um sistema completo de redefinição de senha em PHP utilizando o WAMPServer, Composer e PHPMailer. Esse é um recurso essencial para qualquer sistema de autenticação, garantindo que os usuários possam recuperar suas contas de maneira segura e eficiente.

Se você gostou deste tutorial, fique de olho em mais dicas e tutoriais aqui no blog!

Reply

or to participate.