Criar serviço de envio de e-mail com AWS SES e Node

Criar serviço de envio de e-mail com AWS SES e Node
Photo by Solen Feyissa / Unsplash

O objetivo desta publicação é criar um microserviço de backend para envio de e-mail. Serão utilizamos nodejs e um serviço de envio de e-mail de terceiros que é o AWS SES. (este é um serviço pago). A principal função é servir de suporte a uma página de contato, então todas as mensagens enviadas por este serviço vão para o mesmo endereço de e-mail para que possam ser lidas. Como é um exemplo completo você pode adaptar para sua necessidade.

Esta publicação assume que algumas configurações foram feitas em seu ambiente.

  • Nodejs já instalado
  • aws-cli configurado com uma credencial válida
  • seu servico do aws-ses está ativo e configurado para fazer o envio de mensagens (este serviço possui uma configuração de sandbox para testes, em alguns casos é necessário configurar e-emails em uma whitelist [quando no modo sandbox está ativo], mas você pode desabilitar o modo sandbox a qualquer momento)

Vamos ver como é o funcionamento do serviço.

O serviço possui apenas 1 rota, que é o post com alguns atributos no corpo da requisição.

Segue a implementação:

const router = require('express').Router();
const AWS = require('aws-sdk')
AWS.config.update({ region: 'us-east-1' })

router.post('/', (req, res) => {
    var params = {
        Destination: { /* obrigatório */
          ToAddresses: [
            'daniellucena@yahoo.com.br',
            /* adicione aqui um e-mail válido */
          ]
        },
        Message: { /* obrigatório */
          Body: { /* este é o corpo da mensagem que aparecerá no e-mail */
            Text: {
             Charset: "UTF-8",
             Data: `Mensagem de: ${req.body.email}, \n ${req.body.message}`
            }
           },
           Subject: {
            Charset: 'UTF-8',
            Data: req.body.title
           }
          },
        Source: 'contato@danizavtz.com.br',
        ReplyToAddresses: [
           'contato@danizavtz.com.br'
        ],
      };
    sendPromise = new AWS.SES({ apiVersion: '2010-12-01' }).sendEmail(params).promise();
    sendPromise.then(
          function (data) {
              res.status(200).json({ msg: data.MessageId })
          }).catch(
          function(err) {
              console.log(err); //esta linha não é necessária, é utilizada apenas para debug
              res.status(500).json({ errors: ['Houve um erro durante o envio'] })
    });
})

module.exports = router;

A aplicação apenas trata JSON, então para interagir com a API, deve-se enviar uma requisição do tipo post com o seguinte conteúdo:

Lembrando que aqui é apenas um exemplo, sendo os atributos message, title e email do tipo String é o que importa, para que seja enviada a mensagem com sucesso.

Repare que nesta solução não estamos validando as entradas antes de submeter ao nosso serviço, o ideal em uma aplicação em produção é que se faça a validação dos campos e sanitização dos valores antes de ser feita qualquer tipo de interação com os dados. Não estamos validando nem se o e-mail é realmente um endereço de e-mail.

Segue o projeto completo para referência.

Para implementar este modelo seguimos a documentação do serviço ses disponibilizado pela AWS

Se está utilizando esta aplicação e está recebendo a mensagem:

We are formalizing our plans to enter AWS SDK for JavaScript (v2) into maintenance mode in 2023.
Please migrate your code to use AWS SDK for JavaScript (v3).

Existe uma versão atualizada desta aplicação neste repositório