Artigo original: How to Use Nodemailer to Send Emails from Your Node.js Server

O Nodemailer é um módulo do Node.js que permite enviar e-mails para o seu servidor com facilidade. Quando você quiser se comunicar com seus usuários ou apenas ser notificado quando algo der errado, uma das opções para fazer isso seria usando o e-mail.

Existem muitos artigos explicando como usar o mínimo necessário do Nodemailer, mas esse artigo não é um deles. Aqui, eu vou te mostrar o modo mais comum de praticar o envio de e-mails do seu back-end do Node.js usando o Nodemailer e o Gmail.

Como começar com o Nodemailer

Primeiro, vamos precisar preparar o nosso Node.js usando o Express. Para ter certeza de que você possui o Node e o npm instalado, execute o seguinte comando:

node -v 
npm -v

Se os dois comandos mostrarem suas versões, você pode continuar. Do contrário, instale o que estiver faltando.

Crie um diretório para o seu projeto. Usaremos nodemailerProject.

mkdir nodemailerProject

Vá para o diretório criado e execute o seguinte comando:

npm init

Isso inicializará o nosso projeto com um arquivo pacakge.json.

A seguir, vamos instalar o Express, usando:

npm install express

Dependendo de qual arquivo você apontou como ponto de entrada (o padrão seria index.js), abra e cole o seguinte código:

const express = require('express')
const app = express()
const port = 3000


app.listen(port, () => {
  console.log(`nodemailerProject is listening at http://localhost:${port}`)
})
index.js

Acima, você tem o necessário para iniciar um servidor simples usando o Express. Você pode vê-lo funcionando executando o comando abaixo:

node index.js

Como instalar o Nodemailer

Instale o Nodemailer usando o seguinte comando:

npm install nodemailer

A API do Nodemailer é bem simples. Faça o seguinte:

  1. Crie um objeto Transporter
  2. Crime um objeto MailOptions
  3. Use o método Transporter.sendMail

Para criar o objeto Transporter, devemos fazer o seguinte:

let transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        type: 'OAuth2',
        user: process.env.MAIL_USERNAME,
        pass: process.env.MAIL_PASSWORD,
        clientId: process.env.OAUTH_CLIENTID,
        clientSecret: process.env.OAUTH_CLIENT_SECRET,
        refreshToken: process.env.OAUTH_REFRESH_TOKEN
      }
    });
✋ Preste atenção, pois além do usuário e das chaves de acesso, que são suas próprias credenciais da sua conta do gmail, outras três chaves deverão ser recuperadas após configurar o OAuth.

Assim como dissemos no começo do artigo, usaremos o Gmail para enviar e-mails. Como você deve ter imaginado, o Gmail possui um alto nível de segurança quando o assunto é enviar e-mails para/pela conta do usuário.

Existem inúmeras formas para superarmos esses obstáculos (algumas melhores que outras). A solução que escolhemos torna necessário configurar um projeto no Google Cloud Platform. Precisamos fazer isso para poder ter credenciais para segurança do OAuth habilitada pelo Gmail.

Se você quiser ler mais sobre a complexidade de usar o Gmail com o nodemailer, vá aqui (documentação em inglês).

O próximo passo requer algumas configurações em vez de código, portanto preparem-se.

image-297
Foto criada por Daniel McCullough, extraída do Unsplash

Configurações do Google Cloud Platform

Se você não tem uma conta no Google Cloud Platform, crie uma, pois é um pré-requisito. Possuindo a conta, crie um projeto clicando na seta do menu que fica no canto superior esquerdo.

1_a4fnFLNMoTtLJuqsKilVnA

Selecione a opção New Project:

1_HNwUG3wPdbrwc3JB5D7_tg

Na próxima janela, teremos que dar um nome ao nosso projeto. Escolha o que você quiser. Continuaremos usando NodemailerProject. Na propriedade location, você pode manter No organization.

1_TRlA6RBLCCCSMQ5R4di27A

Deve levar alguns segundos para o projeto estar pronto para ser usado. Quando estiver, será possível ver a seguinte janela:

1_FT9MhBZyU4cZd4Qg6zeFag

Abra o menu de navegação clicando nos três pontos no canto superior esquerdo e selecione APIs and Services:

1_qPaPpPadHQLdKCQbhjND7Q

Para habilitar a utilização do Nodemailer no Gmail, teremos que usar o OAuth2. Se você não estiver familiarizado com o OAuth, ele é um protocolo de autenticação. Eu não vou ser muito específico aqui, pois não é necessário. Se, no entanto, você quiser entender mais sobre isso, pode acessar aqui (documentação do OAuth em inglês).

Primeiro, vamos configurar a nossa tela de consentimento do OAuth (em inglês, OAuth Consent Screen):

1_W2oeT1KmJXpwSQlIMIVo5w

Se você não for um membro do G-Suite, a única opção disponível será External em User Type.

1_l_GrPVtXODPS0GXKLMdWYA

Após clicar em Create, a próxima janela vai exigir o preenchimento das informações da aplicação (ou do servidor):

1_reZ04hUX4jh1IzLGh7vCFA

Preencha com o seu e-mail no campo User support email e no campo de informações de contato do desenvolvedor. Clicando em Save and Continue, será apresentada a fase Scopes dessa configuração. Pule essa fase, já que não é relevante para nós. A seguir, entramos na fase Test Users.

1_Jms50wZ5mVmUyOaiVF7b4w

Aqui, se adicione como usuário e clique em Save and continue.

Como configurar o OAuth

Nesta fase, vamos criar as credenciais do OAuth para serem usadas com o Nodemailer. Vá até a aba Credentials, acima de OAuth Consent Screen. Clique no sinal de mais (➕) do texto Create Credentials e escolha OAuth Client ID.

1_h0nME2ccR7HPjKmz_DMZRw

No item Application type, escolha Web Application:

1_72Em-VS-fdM2WCwOA6zcfg

Na seção Authorized Redirect URIs, não se esqueça de adicionar o "OAuth2 Playground" (https://developers.google.com/oauthplayground), já que vamos usá-lo para pegar uma das chaves mencionadas anteriormente neste artigo.

1_ywIcOlqA5DHdsPaSNnjJ9Q

Após clicar em Create, você receberá o seu Client id e o segredo do client. Mantenha-os e nunca os exponha sob qualquer condição ou formato.

image-298
Foto criada por Power Lai, extraída do Unsplash

Mantenha o seu token do OAuth atualizado

Para manter o seu token atualizado, o qual usaremos para transportar o objeto no Nodemailer, vamos precisar acessar o "OAuth2 Playground". Aprovamos esse "URI" para esse propósito específico em um momento anterior.

1. Clique no ícone de engrenagem à direita (que é a configuração do OAuth2) e marque a caixa para usar sua própria credencial do OAuth2 (em inglês, Use your own oAuth credentials):

1_Kbg3RnTBNkDd_RQ0zn59mQ

2. Do lado esquerdo, você verá uma lista de serviços. Role para baixo até ver Gmail API v1.

1_BppvkU1r4JzZ6j6FvC2qNw

3. Clique em Authorize APIs.

Você será apresentado a uma tela para fazer login em qualquer uma de suas contas do Gmail. Escolha aquela que você listou como um usuário de teste (na fase Test Users, anteriormente).

4. A próxima tela informará que o Google ainda não verificou essa aplicação, mas isso está ok, já que nós não a enviamos para verificação. Clique em Continue.

1_rL0tNdaZqOyIg6aCp4IR3g

5. Na próxima janela, será perguntado se você quer conceder permissão ao seu projeto para interagir com a sua conta do Gmail. Dê a permissão clicando em Allow.

1_y0TUXbtC_oUaB6KoGlURbQ

6. Feito isso, você será redirecionado de volta para o OAuth Playground e poderá ver que há um código de autorização no menu à esquerda. Clique no botão azul  "Exchange authorization code for tokens" (em português, troca de autorização de código para tokens).

Os campos para o token de atualização e para o token de acesso serão preenchidos.

De volta ao servidor

Depois de fazer todas essas configurações, podemos retornar à nossa aplicação e inserir todos os dados na criação do transportador. Para manter todas as suas credenciais privadas, você pode usar o pacote dotenv. Não se esqueça de adicionar o arquivo .env que você criará no .gitignore.

Então, agora, temos o seguinte:

let transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        type: 'OAuth2',
        user: process.env.MAIL_USERNAME,
        pass: process.env.MAIL_PASSWORD,
        clientId: process.env.OAUTH_CLIENTID,
        clientSecret: process.env.OAUTH_CLIENT_SECRET,
        refreshToken: process.env.OAUTH_REFRESH_TOKEN
      }
    });

Em seguida, criamos o objeto mailOptions, que contém os detalhes de para onde enviar o e-mail e com quais dados.

let mailOptions = {
      from: tomerpacific@gmail.com,
      to: tomerpacific@gmail.com,
      subject: 'Nodemailer Project',
      text: 'Hi from your nodemailer project'
    };

Esse objeto pode ter muito mais campos e até mesmo vários destinatários, mas não entraremos nesses detalhes aqui.

Finalmente, usaremos o método sendMail:

transporter.sendMail(mailOptions, function(err, data) {
      if (err) {
        console.log("Error " + err);
      } else {
        console.log("Email sent successfully");
      }
    });

Execute sua aplicação e verá na sua caixa de entrada que recebeu um novo e-mail.

Este artigo foi inspirado em um projeto que criei usando o Nodemailer. Se você quiser conferir, acesse-o aqui.