Envio de email com NodeJS e Gmail
Tags: node, nodemailer, javascript, tutorial
Published: 2023-05-16 01:08:36

Uma dúvida que eu tive há pouco tempo e talvez você também esteja tendo, já que veio até esse post, que é: Como enviar emails na minha aplicação NodeJS?

Fique até o fim desse post que eu te conto.

- [Iniciando o projeto](#iniciando-o-projeto)
- [Instalando as dependências](#instalando-as-dependências)
- [Criando a aplicação](#criando-a-aplicação)
- [Configurando o Gmail](#configurando-o-gmail)
- [Utilizando o Nodemailer](#utilizando-o-nodemailer)

## Iniciando o projeto

Bem vamos começar iniciando um novo projeto Node para começarmos. Vamos criar uma pasta para isso, vou chama-la de **node-mail**

```bash
mkdir node-mail
```

Com a pasta criado vamos entrar nela e de fato iniciar um projeto node

```bash
cd node-mail

npm init -y
```

## Instalando as dependências

Com nosso projeto iniciado, vamos precisar instalar duas dependências que são:

* **express** 
* **nodemailer**

```bash
npm i express nodemailer
```

O **express** será usado para criarmos a nossa aplicação e o **nodemailer** será a biblioteca que servirá para enviar emails.

## Criando a aplicação

Vamos criar um arquivo `index.js`. E criar uma aplicação express ```js
const express = require("express");

const app = express();
```

Em seguida, vou criaremos um rota `/` apenas para mostrar que a API está funcionando e vou iniciar o app na porta 3000.

```js
app.get("/", (req, res) => {
	return res.json({ API: "OK" });
});

app.listen(3000, () => {
	console.log(`Server is running: http://localhost:3000`)
});
```

No final nosso `index.js` deve está assim:

```js
const express = require("express");

const app = express();

app.use(express.json());

app.get("/", (req, res) => {
	return res.json({ API: "OK" });
});

app.listen(3000, () => {
	console.log(`Server is running: http://localhost:3000`)
});
```

Podemos criar um script *start* no `package.json` para rodar a nossa API para testarmos se está tudo funcionando.

```json
{
  "name": "node-mail",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
	 "start": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.2",
    "nodemailer": "^6.9.1"
  }
}
```
Depois de rodar o comando `npm start` e entrar em http://localhost:3000 você deve ver a resposta em JSON da nossa rota


![Resposta da API em JSON](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qc1itp731kxbd0gi201i.png)

## Configurando o Gmail

Para esse exemplo vou utilizar o Gmail para enviar nossos emails. Mas para isso vamos precisar configura-lo, pois o Gmail não permite que aplicativos não seguros acessem sua conta.

Primeiro você vai precisar entrar nas configurações de segurança da sua conta do Google. Você pode fazer isso entrando no [Google](www.google.com) e clicando na sua foto no canto superior direito e depois em *Gerenciar sua Conta do Google*. 

Depois, na esquerda, você entrará na aba *Segurança*. E irá procurar e ativar a opção de *Verificação em duas etapas*.


![Aba segurança](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztucwc1fquytxgqomyxw.png)

Ainda na aba de *Verificação em duas etapas*, no final você terá a opção *Senhas de app*.


![Senhas de app](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pddqxzhi002u74m0u8y2.png)

Aqui vamos criar uma senha para usarmos no nosso app. Selecione a opção *Selecionar app* e escolha *Outro* para darmos um novo personalizado e aperte em gerar.


![Selecionar app](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s9kkbe57uucc16m830bm.png)

Irá aparecer um tela com a sua senha gerada copie ela e vamos voltar para o código.


![Senha gerada](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0377kkh32uevguzejzs8.png)

## Utilizando o Nodemailer

Vamos criar o `transporter` do nodemailer. Crie o arquivo `email-service.js`

```js
const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
	service: "gmail",
	auth: {
		user: "seu-email",
		pass: "eiydjkhxannposfr" // senha que geramos no gmail
	}
});

module.exports = transporter;
```

Com o `transporter` criado podemos voltar ao `index.js` e criar uma rota que irá enviar o email

```js
const express = require("express");
// Importando o transporter que criamos no email-service.js
const transporter = require('./email-service');

const app = express();

app.use(express.json());

app.get("/", (req, res) => {
	return res.json({ API: "OK" });
});

// Rota para enviar email
app.get("/send-email", async (req, res) => {
	try {
		const options = {
			from: "seu-email",
			to: "email-destino",
			subject: "Assunto do email",
			text: "Texto do email", // Texto caso o email do usuário não suporte HTML
			html: "<h1>HTML do email</h1>"
		};

		await transporter.sendMail(options);

		return res.json({ message: "Email enviado com sucesso" });
	} catch (error) {
		console.log(error);
		return res.status(500).json(error);
	}
});

app.listen(3000, () => {
	console.log(`Server is running: http://localhost:3000`)
});
```

Vamos rodar a API com `npm start` e acessar a rota `/send-email`. E se tudo der certo teremos a resposta:


![Email enviado com sucesso](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0l3i4jyfxroyu38nj80s.png)

E se você conferir o email do destinatário verá que o email foi recebido com sucesso!