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}`)
})
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:
- Crie um objeto Transporter
- Crime um objeto MailOptions
- 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.

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.

Selecione a opção New Project:

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.

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

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

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):

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

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

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.

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.

No item Application type, escolha Web Application:

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.

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.

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):

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

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.

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.

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.