É muito comum em projetos de software web que exista a necessidade de envio de mensagens por e-mail, os chamados e-mails transacionais e em projetos NestJS não seria diferente. Embora não seja algo particularmente difícil e talvez você até já tenha uma ideia de como fazer se já fez isso com Node.js antes, no tutorial de hoje eu vou lhe ensinar como configurar o seu projeto NestJS para envio de emails. Obviamente parto do pressuposto que você já sabe o básico de NestJS, mas se não souber, comece por este outro tutorial aqui.
Para que consiga fazer este tutorial você vai precisar ter uma conta de email criada em algum provedor e ter em mãos os dados da conexão SMTP da mesma ou usar um provedor fake (falarei mais adiante). Essas configurações são as mesmas que são necessárias para envio via ferramentas estilo MS Outlook e Apple Mail, você encontra elas facilmente na documentação de ajuda do seu provedor de email. Opcionalmente e buscando uma abordagem ainda mais profissional, você pode utilizar um SMTP Gateway profissional, como SendGrid, Mandrill, Mailgun e outros.
Para usar um provedor fake durante o desenvolvimento é muito simples, você pode obter dados de teste no ethereal.email.
Vamos lá!
#1 – Setup do Projeto
Vamos começar criando um novo projeto NestJS, com o comando abaixo.
1 2 3 |
npx @nestjs/cli new email-example |
Agora vamos instalar a dependência que vamos precisar. A saber:
- @nestjs-modules/mailer: módulo da comunidade Nest para configuração de envio de emails;
- Nodemailer: o pacote que enviará o email de fato;
Comando de instalação:
1 2 3 |
npm install @nestjs-modules/mailer nodemailer |
E também os types do Nodemailer como dependência de desenvolvimento, para melhor suporte ao Javascript.
1 2 3 |
npm install -D @types/nodemailer |
Opcionalmente você pode também usar um arquivo .env para fazer a gestão de variáveis de ambiente do projeto, como ensinei neste outro tutorial. Não é obrigatório, mas ajuda na hora de fazer setup do projeto em uma nova máquina.
E com isso temos nosso projeto criado e minimamente configurado.
#2 – Configuração do Módulo
Agora que temos nosso projeto criado e com as dependências instaladas, é hora de programarmos o envio de email com ele, usando o pacote Nodemailer, o mais popular do mundo JS para esta atividade. Mas devemos começar importando o MailerModule para dentro do módulo em que iremos utilizá-lo, como abaixo, onde importo e configuro no app.module.ts que vem por padrão em projetos Nest.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { MailerModule } from '@nestjs-modules/mailer'; @Module({ imports: [MailerModule.forRoot({ defaults: { secure: false, //para usar 587 ou true para 465 } })], controllers: [AppController], providers: [AppService], }) export class AppModule { } |
Aqui nós temos três configurações importantes cujas informações você pegará com seu provedor de SMTP:
- transport: o endereço de SMTP Transport do seu provedor de email. Ele pode usar SMTP ou SMTPS como protocolo e deve conter a conta de email que será usada na autenticação ([email protected]), a senha (password) e o servidor (smtp.domain.com);
- secure: isso varia entre os provedores, alguns usam false (porta 587) e outros usam true (porta 465), tem de verificar na informação do seu provedor;
- from: geralmente é o mesmo endereço de email usado na autenticação, indica qual a conta que vai enviar as mensagens;
Se estiver utilizando .env, vai querer colocar algumas destas configurações (ou todas) no referido arquivo, para facilitar a gestão.
Com isso temos nosso módulo configurado para envio SMTP.
#3 – Envio de Mensagens
Agora que temos nosso módulo de envio importado e configurado, é hora de usar ele em nosso controller. Usarei abaixo o app.controller.ts que já vem no projeto padrão do NestJS.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; import { MailerService } from '@nestjs-modules/mailer'; @Controller() export class AppController { constructor( private readonly appService: AppService, private readonly mailerService: MailerService ) { } @Get() async getHello(): Promise<string> { await this.mailerService.sendMail({ subject: "Test subject", text: "Test message" }) return this.appService.getHello(); } } |
Aqui eu comecei importando o MailerService no topo do arquivo e depois declarei nosso mailerService no constructor do controller para que essa dependência seja injetada pelo AppModule que configuramos anteriormente. Uma vez com essa dependência injetada, podemos utilizá-la dentro de qualquer função do nosso controller, sendo que optei por usá-la no getHello que já vem por padrão como exemplo. Claro que você pode criar outra função para isso.
O envio da mensagem de email se dá pela função sendMail do mailerService e espera um objeto de mensagem por parâmetro, com to (destinatário), subject (assunto) e text (conteúdo do email). Aqui eu mandei strings simples mas claro que você pode montar algo mais complexo.
Para testar é muito simples, suba sua aplicação NestJS e acesse-a pelo navegador mesmo, já que é uma rota GET na raiz do backend. O resultado em poucos segundos, se tudo estiver correto, será uma mensagem nova na caixa de email do destinatário e um Hello World na tela do navegador.
Até a próxima!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.