Email

Criar autenticação de e-mail do Laravel 11 com Mailgun e Digital Ocean

Integre o Laravel versão 11.x ao Mailgun para adicionar a capacidade de verificar os e-mails do usuário. Continue lendo para conferir nosso guia passo a passo.
Imagem para Criar autenticação de e-mail do Laravel 11 com Mailgun e Digital Ocean

Quando foi lançada, a versão 5.7 do Laravel adicionou uma nova capacidade de verificar os e-mails do usuário. Se você já executou o php artisan make:auth dentro de um aplicativo Laravel, sabe a sensação de prazer e empolgação ao ver todas as suas páginas de cadastro e login, completas com hash de senha e uma tabela users já criada.

Essa empolgação logo vai passar após a implantação em produção, apenas para descobrir que qualquer pessoa pode se cadastrar com garbage@notrealemail.com ou qualquer outra coisa que quiser digitar. Essa fina camada de autenticação de sessão não ajuda muito em um aplicativo ativo. A introdução da MustVerifyEmailinterface no Laravel 5.7 foi adicionada à estrutura de autenticação para que, a fim de fazer login, os usuários precisem usar um endereço de e-mail real e válido.

Não houve mudanças significativas no recurso de autenticação de e-mail dentro do Laravel (agora na versão 11), mas recomendamos atualizar para a versão mais recente se ainda não o fez.

O Laravel 11, lançado em 12 de março de 2024, continua oferecendo recursos poderosos de verificação de e-mail, enquanto introduz uma estrutura de aplicativo simplificada e outras melhorias. Este tutorial guiará você na configuração da autenticação de e-mail no Laravel 11 usando o Mailgun e na implantação dela na Digital Ocean.

1. O requisito mínimo de PHP agora é 8.2.

2. Há uma estrutura de aplicativo mais simplificada com um arquivo bootstrat/app.php revitalizado.

3. Uso padrão do SQLite para armazenamento de banco de dados, sessões, cache e filas.

4. Novo recurso de roteamento de integridade para monitoramento de aplicativos.

Criar um novo aplicativo Laravel

O primeiro passo é criar um novo aplicativo com algumas configurações:

                                

                                    $ laravel new email-verification-example rnrn$ cd email-verification-example rnrn$ touch database/database.sqlite 
                                
                            

Isso vai criar o aplicativo Laravel 11.x padrão com a estrutura de autenticação e um arquivo para um banco de dados SQLite. Atualize seu arquivo .env para apontar para o caminho completo do arquivo SQLite:

                                

                                    DB_CONNECTION=sqlite rnDB_DATABASE=/full/path/to/email-verification-example/database/database.sqlite 
                                
                            

Verificação de e-mail no Laravel 11

Vamos inspecionar a estrutura de autenticação padrão e ver quais mudanças precisam ser feitas para adicionar a verificação de e-mail.

Você pode ver a documentação de validação de e-mail do Laravel aqui.

No Laravel 11, o processo de adicionar a verificação de e-mail permanece semelhante, mas a estrutura de arquivos mudou. Abra seu arquivo bootstrap/app.php e certifique-se de que ele inclua o seguinte: 

Em seguida, implemente a interface MustVerifyEmail. Uma interface em PHP especifica os métodos que uma classe deve implementar. Você precisará verificar se o seu AppModeIsUser implementa o contrato IlluminateContractsAuthMustVerifyEmail:

Essa interface impõe que tenhamos três novos métodos em nosso modelo User:

  • hasVerifiedEmail()
  • markEmailAsVerified()
  • sendEmailVerificationNotification()

A implementação desses métodos pode ser encontrada em: vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php. Para marcar um usuário como verificado, precisamos ter uma coluna email_verified_at em nossa tabela users, que já é fornecida em nossa migração padrão de criação da tabela users:

                                

                                    Schema::create('users', function (Blueprint $table) { rn   $table->increments('id'); rn   $table->string('name'); rn   $table->string('email')->unique(); rn   $table->timestamp('email_verified_at')->nullable(); rn   $table->string('password'); rn   $table->rememberToken(); rn   $table->timestamps(); rn});
                                
                            

Execute as migrações para criar a tabela: php artisan migrate.

No arquivo routes/web.php, atualize as rotas de autenticação para incluir a verificação de e-mail:

                                

                                    Auth::routes(['verify' => true]);
                                
                            

No Laravel 11, as rotas são definidas no arquivo bootstrap/app.php. Certifique-se de que suas rotas da web estejam incluídas e adicione as rotas de verificação: 

                                

                                    ->withRouting( rnrn    web: __DIR__.'/../routes/web.php', rnrn    commands: __DIR__.'/../routes/console.php', rnrn    health: '/up', rnrn) 
                                
                            

Então, em seu arquivo routes/web.php, adicione: 

Para ver todas as rotas disponíveis no seu aplicativo, você pode executar php artisan route:list. Isso é praticamente tudo o que precisamos fazer no lado do Laravel para verificar e-mails. No entanto, se você tentar agora, não vai funcionar.

Laravel code

Antes de podermos enviar e-mails de nosso servidor PHP, precisamos configurar um driver de e-mail dentro do Laravel. Mas você pode conferir usando tinker para ver que um usuário foi criado com um email_verified_at nulo.

Introdução ao Mailgun

O Mailgun oferece a capacidade de enviar e-mails via servidor SMTP ou por meio de sua API. Neste tutorial, enviaremos e-mails por meio da API do Mailgun. É mais rápido, dimensiona melhor e dá menos trabalho para configurar do que o SMTP.

Mailgun API call

Vamos enviar chamadas de API. Para isso, precisamos do Guzzle:

$ composer require guzzlehttp/guzzle

Para que o nosso aplicativo envie e-mails: precisamos de um nome de domínio hospedado. Tenho um nome de domínio que comprei pelo Google Domains por cerca de US$ 12/ano. O site (https://employbl.com/) está hospedado no Laravel Forge por uma taxa mensal. Para implantá-lo, eu segui o curso do Laracasts, Learn Laravel Forge.

Nesse curso, configurei meu aplicativo Laravel para ser executado a partir de droplets da Digital Ocean. Nesse processo, configurei meu nome de domínio do Google para apontar para a Digital Ocean.

Depois de criar uma conta no Mailgun, você precisará verificar seu domínio, o que leva cerca de 24 horas. Para fazer isso, precisamos adicionar os registros TXT, CNAME e MX.  Se os registros MX já estiverem apontados para um provedor de caixa de correio, você poderá configurar um subdomínio. Para encontrar esses registros, acesse o domínio em sua conta do Mailgun e verifique Verificação de domínio & DNS. Assim que você tiver um domínio do Mailgun funcionando, vá até o painel para encontrar a sua chave de API e atualize o arquivo .env conforme necessário.

MAIL_DRIVER=mailgun MAILGUN_DOMAIN=mg.SEU_DOMINIO.com MAILGUN_SECRET=SUA_CHAVE_AQUI

Saiba mais: o Laravel mudou para um versionamento anual. Agora na V10, você pode esperar correções em 6 de agosto de 2024 e correções de segurança até 14 de fevereiro de 2025. Ver notas de lançamento do Laravel 10.

Verificar se funciona

Com o envio de e-mail configurado, depois que um usuário se cadastra, ele verá uma landing page pedindo para verificar o seu e-mail. Essa página pode ser modificada em resources/views/auth/verify.blade.php.

Verify your email Laravel

Isso vai enviar um e-mail real para o endereço que você forneceu. O modelo para esse e-mail existe em IlluminateAuthNotificationsVerifyEmail.php.

Laravel verify email address link

Se não quisermos que nossos e-mails de verificação digam “Regards” ou o texto acima, então precisamos personalizá-los. Você pode publicar os modelos padrão usando os comandos de publicação abaixo:

                                

                                    $ php artisan vendor:publish --tag=laravel-notificationsrn$ php artisan vendor:publish --tag=laravel-mail
                                
                            

Em seguida, escreva os novos padrões em resources/views/vendor/notifications/email.blade.php. Se tiver mais coisas para alterar, você pode reimplementar a notificação adicionando um novo método sendEmailVerificationNotification ao seu modelo User que retorna uma notificação personalizada feita por você.

Depois que o usuário clicar no link de verificação de endereço de e-mail, ele será redirecionado para o seu painel, podendo fazer login sem problemas.

Laravel login

Isso deve ser o suficiente para você começar! A parte mais difícil para mim foi configurar o servidor de e-mail e o Mailgun. Depois que o seu domínio é verificado e o Mailgun está todo configurado, a parte do Laravel acaba sendo simples.

Você conseguiu fazer tudo funcionar? Alguém já está usando essa funcionalidade em produção? Entre em contato comigo no Twitter ou deixe comentários abaixo.

Recursos

Achei esses tutoriais, além dos links acima, muito úteis.

Quer mais postagens como esta do Mailgun?

Connor Leech, nosso autor convidado, é engenheiro de software na Stitch Labs. Você pode contatá-lo através do e-mail dele. Para conferir mais postagens e guias de resolução de problemas, assine a nossa newsletter para não perder nenhum insight de especialistas que convidamos e da nossa equipe fanática por e-mail.