- Concluído 💪
A idéia desde projeto surgiu durante a atividade final da desciplina de Redes de Computadores II, do curso de Engenharia da Computação, onde o projeto escolhido foi um servidor de envio de email, onde este servidor deve fornecer métricas de tempo de desempenho de envio de email baseado no tipo de protocolo enviado, no caso dois protocolos foram usados para enviar email, SMTP
e HTTP
.
Este projeto consiste de uma aplicação web para envio de email baseando em protocolos de comunicação HTTP e SMTP. Além de pode escolher qual protocolo deseja enviar o email, este app possui um contador de tempo (em milisegundos) para que possa ser feita a análise de performance de cada protocolo durante o envio. Oferece o resultado de tempo médio de envio para cada protocolo e por fim, com base em todos os emails enviados, exibe gráfico para se ter uma comparação geral da performance.
Veja, logo abaixo, imagem do formulário de envio de email:
Podemos escolher qual protocolo será usado no envio graças a biblioteca nodemailer-sendgrid-transport
.
Código que define o protocolo de envio:
const dotenv = require('dotenv');
const nodemailer = require('nodemailer');
const sendGrid = require('nodemailer-sendgrid-transport');
dotenv.config();
// para protocolo HTTP
exports.transport = nodemailer.createTransport(
sendGrid({
auth: {
api_key: process.env.SENDGRID_API_KEY,
},
}),
);
// para protocolo SMTP
exports.transportOverSMTP = nodemailer.createTransport({
service: 'SendGrid',
auth: {
user: process.env.SENDGRID_USERNAME,
pass: process.env.SENDGRID_PASSWORD,
},
});
E no controller
da aplicação, verificamos o valor do input que escolhe o protocolo de envio, e assim fazemos o envio do email:
if (protocol === 'HTTP') {
transport.sendMail(sendEmailObject, (error, info) => {
callback(error, info, 'HTTP');
});
}
if (protocol === 'SMTP') {
transportOverSMTP.sendMail(sendEmailObject, (error, info) => {
callback(error, info, 'SMTP');
});
}
Este site foi feito com as tecnologias: MongoDB, NodeJS e, principalmente, faz o uso da API SendGrid através do Nodemailer para envio de emails sob os protocolos HTTP e SMTP. Os emails submetidos pelo usuário, são enviados ao servidor NodeJS e este armazena dados do email como protocolo, data de envio e protocolo usado, no banco de dados MongoDB antes de os enviar através da API do SendGrid.
Veja mais sobre protocolo a ser usado com SendGrid e Nodemailer:
Nesta aplicação voçê pode:
-
Enviar email escolhendo o protocolo a ser usado (
SMTP
/HTTP
) -
Visualizar o histórico de envio, onde é informado:
-
Data de envio
-
Email de destino(Destino)
-
Protocolo usado no envio
-
Status do envio onde:
-
Pendente: Email foi entregue ao serviço do SendGrid, mas o mesmo ainda não foi entregue ao destinatário.
-
Enviado: Email entregue ao destinatário.
-
Falha ao enviar: Falhou ao enviar email.
-
-
Tempo decorrigo do procedimento em milisegundos
Exemplo de status de envio:
Data envio: 09/11/2020 as 11:52 horas Destino: cubeleexuzz@gmail.com Protocolo: HTTP Status: Pendente Tempo decorrido: 0 milisegundos
-
-
Visualizar os números de desempenho do tempo decorrido para cada protocolo. Os dados são exibidos para comparação em:
O envio de emails podem não funciona para destinatários com provedores Outloook/Hotmail. Pequisando sobre o erro, encontrei algumas informações neste link.
I’ve seen the same thing it looks like providers are blocking the IP range of SendGrid’s “free” plans.Assuming you authenticated your emails properly and followed SPF, dkim and DMARC then the only other solution is to upgrade your account to a dedicated IP and hope that range isn't blacklisted.
Basicamente o que é dito:
ALguns provedores estão bloqueando os IP's do planos gratuitos do SendGrid. A solução seria mudar para o plano pago para obter um IP dedicado e este IP não está na lista de IP's bloqueados dos provedores.
Ou pode ser necessário ajustar a autenticação de dominio no site do SendGrid.
You have to do this: https://sendgrid.com/docs/ui/account-and-settings/how-to-set-up-domain-authentication/
Para não ter todo o trabalho de ter que configurar ou mudar de plano, é ALTAMENTE RECOMENDADO QUE OS DESTINATÁRIOS SEJAM EMAILS PROVIDOS PELO SERVIÇO DO GOOGLE, OU SEJA, USE DESTINATÁRIOS @gmail.com
, assim os email serão recebidos e não serão bloqueados pelo provedor.
Em todos os testes feitos por mim, os email enviados para *@gmail.com
, foram recebidos.
Para usar localmente em sua máquina, voce deve ter instalado em sua máquina o NodeJS com uma versão minima recomendada v12.0.0
, MongoDB e o Git.
Além disto é bom ter um editor para trabalhar com o código como VSCode.
Para começar, faça o clone deste repositório. Digite o comando no terminal:
$ git clone https://github.com/IglanCardeal/performance-email-app
Acesse a pasta do projeto:
$ cd performance-email-app
Instale as dependências do projeto usando o npm
ou yarn
se preferir:
$ npm install
# ou
$ yarn install
Agora precisamos configurar o arquivo .env
, que contém as variáveis de ambientes essenciais para executar a aplicação. Neste respositório, temos um arquivo de exemplo das variáveis de ambiente chamado .env,example
. Abra esse arquivo e veremos o seguinte:
# APP detalhes
APP_NAME= App Envio de Email
APP_AUTHOR= Iglan Cardeal
APP_EMAIL= emailperformanceapp@teste.com
# APP Port
PORT= 3000
HOST= localhost
# Database MongoDB
DB_NAME=app-envio-email
DB_PORT=27017
# Quando NODE_ENV=development
DB_DEV_HOST=127.0.0.1
# Quando NODE_ENV=production
DB_HOST=127.0.0.1
# URL Provedor externo
DB_HOST_EXTERNAL=
# SendGrid account API key
SENDGRID_API_KEY= <sua KEY do SendGrid>
# SendGrid accounts
SENDGRID_USERNAME= <seu usuario do SendGrid>
SENDGRID_PASSWORD= <sua senha do SendGrid>
Vamos ajustar o essencial. As chaves para uso da API do SendGrid são importantes para uso do serviço de envio de email. Voçê pode gerar uma chave de API no site SendGrid. Após realizar os cadastros e gerar a sua chave da API, faça os ajustes inserindo seus dados:
SENDGRID_API_KEY= <sua KEY do SendGrid>
SENDGRID_USERNAME= <seu usuario do SendGrid>
SENDGRID_PASSWORD= <sua senha do SendGrid>
Agora, renomeie o arquivo .env.example
para .env
.
Feito isso, execute o comando abaixo e o aplicativo será iniciado localmente como ambiente de desenvolvimento em sua máquina:
$ npm run dev
# ou
$ yarn dev
Agora abra seu navegador na URL http://localhost:3000
e verá a página inicial do projeto.
Sem problemas!
Voçê pode inserir uma URI de algum provedor como o Atlas. Neste caso, vamos definir um URI no em DB_HOST_EXTERNAL=
. Esta variável tem prioridade, logo se voçê definiu uma URI, ela será usada, senão deixea vazia.
A URI a ser usada, no caso se voçê usar o Atlas, terá o formato semelhante a seguir:
DB_HOST_EXTERNAL=mongodb+srv://<username>:<password>@cluster0.zcr3z.mongodb.net/<dbname>?retryWrites=true&w=majority
Onde:
-
username
: seu nome de usuário -
password
: sua senha -
dbname
: nome da base de dados. Eu recomendo chamar deemail-performance-app
Tendo Feito todas as configurações, execute npm run dev
ou yarn dev
para iniciar a aplicação.
OBS: ao executar o comando para iniciar a aplicação, será exibido no terminal a URI de conexão com o banco.
Uma solução alternativa é subir um container do Docker do MongoDB. Existe a imagem oficial do mongo que podemos usar para subir um container mongodb e usar o banco de dados.
Na raíz do projeto temos um arquivo docker-compose.yml
com as seguintes características:
version: '3'
services:
mongo:
container_name: db_app-envio-email
image: mongo
restart: always
ports:
- ${DB_PORT}:27017
Esse arquivo é a base para gerar um container do mongodb.
Temos também um arquivo Makefile
para que possamos executar comandos do docker-compose
de uma maneira mais rápida.
Características do Makefile
:
include .env
.PHONY: up
up:
docker-compose up -d
.PHONY: down
down:
docker-compose down
.PHONY: logs
logs:
docker-compose logs -f
-
include .env
carrega as variáveis de ambiente do arquivo.env
. -
up
executa odocker-compose
com os containers em background -
logs
exibe os logs -
down
desmonta os containers
Para subir o container, digite no terminal make up
, e aguarde o docker baixar e montar a imagem do mongodb.
Ao finalizar, execute make logs
, para verificar se tudo ocorreu bem nos logs.
Execute make down
para desmontar o container.
OBS: Para a aplicação se conectar com o container do mongodb, a varável DB_HOST_EXTERNAL
não pode estar definida.
- NodeJS
- Express (Framework web)
- Ejs (Template engine)
- SendGrid
- MongoDB
- Docker
- PM2 (Para clusterização em produção)
- Bootstrap (Framework CSS)
- Git
- VSCode
Iglan Cardeal
Desenvolvido e mantido por Iglan Cardeal 🔨
Desenvolvedor NodeJS 💻
Entre em contato! 👋🏽
- cmtcardeal@outlook.com 📧
- Instagram @cmtcardeal
- StackOverflow Cmte Cardeal