Testando envio de e-mails no Node utilizando Mailhog

Node.js 2 de Mai de 2019

Sua aplicação provavelmente envia e-mails e quando você está em ambiente de desenvolvimento precisa testar se suas mensagens estão chegando da maneira correta, pro destinatário correto e com a devida formatação.

Existem algumas ferramentas como o Mailtrap, uma alternativa online que provê um servidor de SMTP para você enviar e testar essas mensagens, mas ainda assim essa ferramenta é paga para mais projetos e você precisa estar online para utiliza-la.

Nesse post vamos conhecer o Mailhog, um serviço que cria um servidor SMTP fake em nossa máquina e nos dá uma interface gráfica para visualizar todos e-mails.

Configurando Mailhog

Existem várias formas de configurar o Mailhog em sua máquina, porém eu aconselho muito que você utilize o Docker, uma ferramenta que nos auxilia na hora de subir serviços em ambientes isolados em um piscar de olhos.

Junto ao Docker eu gosto de utilizar o Docker Compose que monta uma série de instruções para instanciar todos serviços que nossa aplicação necessita para funcionar, e dessa forma, os outros desenvolvedores conseguem criar o ambiente de desenvolvimento completo da aplicação em segundos.

Com o Docker e o Docker Compose devidamente instalados, em sua aplicação você pode criar um arquivo docker-compose.yml contendo o seguinte conteúdo:

version: '3'

services:
  mailhog:
    image: mailhog/mailhog
    ports: 
      - 1025:1025
      - 8025:8025

A partir desse momento, executando o comando docker-compose up -d, o container do Mailhog será montado e você já poderá acessar sua interface gráfica através do endereço: http://localhost:8025.

Interface do Mailhog

Nessa interface irão aparecer todos e-mails que enviarmos para nosso servidor SMTP fake, e agora podemos fazer um envio de e-mail simples através do NodeJS para ver isso funcionando.

Configurando NodeJS

Na mesma pasta do docker-compose.yml vamos instalar o pacote nodemailer e configurar um script simples em NodeJS com o seguinte conteúdo:

// index.js

const nodemailer = require('nodemailer');

const transport = nodemailer.createTransport({
  host: process.env.MAILHOG_HOST,
  port: '1025',
  auth: null
});

transport.sendMail({
  from: 'Diego Fernandes <diego@rocketseat.com.br>',
  to: 'Eu mesmo <diego@rocketseat.com.br>',
  subject: 'Testando Mailhog',
  html: '<h1>Funcionou!</h1>'
})

Veja que a única coisa um pouco diferente que um script convencional é que estamos buscando uma variável ambiente chamada MAILHOG_HOST que ainda não temos e além disso não estamos passando nenhuma credencial de acesso ao servidor SMTP.

Para conseguirmos repassar o endereço do Mailhog como uma variável ambiente pra nossa aplicação, precisaremos também que nosso app esteja rodando dentro do Docker e pra isso vamos criar nosso Dockerfile que contém a "receita" para nosso script rodar em um ambiente totalmente cru:

FROM node:alpine

WORKDIR /usr/app

COPY index.js ./

RUN yarn add nodemailer

E agora no docker-compose.yml precisamos configurar o serviço da nossa aplicação dentro da categoria services:

app:
  build: .
  command: node index.js
  environment:
    - MAILHOG_HOST=mailhog

Veja que estou enviando dentro da propriedade environment a variável MAILHOG_HOST que estamos esperando no envio de e-mail, e o valor dela é mailhog que é exatamente o nome do serviço que criamos anteriormente no Docker Compose, ou seja, ele vai substituir esse valor com o IP do Mailhog.

Agora se executarmos docker-compose up -d novamente, devemos ver uma nova mensagem dentro da interface do Mailhog:

Concluindo

Massa, agora que você tem um servidor SMTP fake rodando em sua máquina pode enviar quantos e-mails quiser podendo analisar o conteúdo, formatação praticamente em tempo-real e offline.

O código da aplicação final está disponível aqui: https://github.com/Rocketseat/blog-testando-emails-mailhog

Ah, se você gostou desse post não esquece de deixar um comentário aí em baixo e também sugerir novos assuntos pra gente tratar aqui no blog :)

Marcadores

Diego Fernandes

Programador full-stack, apaixonado pelas melhores tecnologias de desenvolvimento back-end, front-end e mobile, é co-fundador e CTO na Rocketseat.