Como enviar emails em Node.js usando o AWS SES (Amazon) - Parte 2

Node.js

Como enviar emails em Node.js usando o AWS SES (Amazon) - Parte 2

Luiz Duarte
Escrito por Luiz Duarte em 07/11/2020
Junte-se a mais de 34 mil devs

Entre para minha lista e receba conteúdos exclusivos e com prioridade

Recentemente escrevi a primeira parte de uma série de artigos de como utilizar a Amazon AWS para disparar emails transacionais ou de marketing de maneira profissional em suas aplicações Node.js.

Não apenas isso, mas começamos a construção de um cliente para o AWS SES, o serviço de email da AWS, em Node.js, o que lhe permitirá construir coisas muito mais interessantes do que apenas o disparo de email em si, mas inclusive o setup de um novo domínio de email de maneira semi-automatizada.

Digo “semi” pois tem algumas etapas de verificação manual que realmente não tem muito o que possa ser feito pois estão em poder do dono do domínio em questão realizar.

Mas sem mais delongas, vamos começar a segunda parte desta série de tutoriais!

Atenção: este é um tutorial intermediário. Se você não tem familiaridade com Node.js dê uma olhada em meus livros e/ou meus cursos.

#4 – Configurando MAIL FROM

Sim, ainda temos mais algumas configurações se você quiser enviar emails que saiam devidamente identificados como sendo enviados pelo seu domínio, ao invés do domínio da Amazon (amazonses.com), até mesmo para diminuir as chances de ser considerado como spam, você deve executar as instruções abaixo, caso contrário, pode pular para a próxima etapa nesta seção.

Se você não fizer isso, repare na imagem abaixo que vem a informação de que foi a Amazon SES que enviou esse email, ao invés de luiztools.com.br.

Manualmente você pode fazer esta validação no seu console da AWS, no serviço SES, indo nos detalhes do seu domínio e rolando até o fim, onde você encontra um botão “Set MAIL FROM Domain”, o que abrirá o popup abaixo.

Basicamente você deve definir um subdomínio para o seu domínio principal e o comportamento caso o DNS deste subdomínio não seja devidamente resolvido.

Via código, a função abaixo faz a mesma coisa.

Nela, eu configuro um objeto de parâmetros para a configuração do MAIL FROM dizendo o domínio que está cadastrado na AWS SES e que vai receber esta configuração, o comportamento no caso do registro MX ainda não estar configurado (faremos na sequência) e o subdomínio que aparecerá para os usuários como sendo o ‘domínio de envio de emails’.

Rode esta função de alguma forma ou crie manualmente como citei antes e o resultado será o mesmo, lá no painel da AWS SES aparecerá nos detalhes do domínio as configurações DNS que devem ser adicionadas na zona do domínio.

Ou seja, o dono do domínio terá de ir na zona de DNS e adicionar dois registros com as configurações citadas ali, sendo um MX e um TXT. Aliás, vale salientar que o MX é para resolução de DNS e o TXT é para autorizar a AWS SES a enviar emails em seu nome, o que chamamos de SPF (Sender Policy Framework).

Pelo que pude perceber não existe uma função na API para retornar aqueles dois registros DNS que precisam ser inseridos, mas eles são facilmente convencionados via código pois seguem este padrão:

Registro 1:  Tipo MX, nome sendo o subdomínio criado e valor como “10 feedback-smtp.<AWS_REGION>.amazonses.com”. Se na sua empresa de DNS o campo prioridade é separado, aquele 10 ali no início vai no referido campo.

Registro 2: Tipo TXT, nome sendo o subdomínio criado e valor como “v=spf1 include:amazonses.com ~all” (sem aspas).

Assim, você deve informar para o dono do domínio que vai enviar emails que ele deve adicionar estes dois registros DNS na zona dele antes de prosseguir. Lembre-se que propagação de DNS é algo que pode levar de alguns segundos até 72h, dependendo da abrangência do seu provedor de DNS.

Mas quando estiver tudo pronto e você estiver enviando emails, eles sairão como tendo sido enviados realmente por você, como abaixo (repare que caiu na caixa de entrada também).

#5 – Autorizando conta de email

E por fim, a última configuração que precisamos fazer é qual a conta de email que você vai autorizar a enviar emails pelo seu domínio. Isso garante mais segurança para sua conta, bem como aumenta as chances dos servidores de email receberem a sua mensagem na caixa de entrada dos destinatários, por estar com todas as identificações devidamente realizadas.

Ou seja, é algo opcional caso você já tenha configurado o seu domínio antes. Mas repare na imagem abaixo, onde enviei um email de uma conta não autorizada (só autorizei [email protected] a enviar emails) e ela caiu em minha caixa de spam, mesmo sendo um domínio autorizado.

Para fazer essa autorização manualmente, você vai no console do AWS SES, na área de Email Addresses e clica em “Verify a New Email Address” informando a conta de email que vai usar para envios.

Para fazer isso via código, você pode usar alterar levemente a função addEmailIdentity que já tínhamos, apenas para deixar explícita a possibilidade de passar um domínio ou uma conta de email específica para ela.

Ao passar uma conta de email ao invés de domínio, esta conta receberá um link de confirmação da Amazon para ser verificada. Antes de prosseguir, o cliente deverá clicar neste link, sendo que o assunto do email que ele vai receber será algo como “Amazon Web Services – Email Address Verification Request in region US East (N. Virginia)”.

E para verificar se a conta dele já foi verificada, basta alterar levemente a função getEmailIdentity que já temos, para deixar explícito que ela pode receber um email ou domínio.

Curso Node.js e MongoDB

#6 – Enviando o Email

Uma vez que sua conta esteja devidamente verificada com os registros DKIM e TXT, você está apto a enviar emails pelo AWS SES. Importante frisar também que aqui usarei uma conta que não está mais em modo Sandbox, sendo importante que você resolva esta pendências com a Amazon também antes de prosseguir ou encontrará alguns problemas como limite de envio por dia, por segundo e para alguns destinatários apenas.

Para envio de email, vamos continuar trabalhando no arquivo sesClient.js, adicionando mais uma função no início deste módulo, logo abaixo das importações que já temos.

A função em si gira em torno do objeto de parâmetro que precisamos configurar antes de chamar a sendEmail do AWS SDK.

Aqui, a abordagem é enviar a mensagem de email para os destinatários, um a um. Você até pode opcionalmente colocar até 50 destinatários na configuração Destination, incluindo To, Cc e Bcc, mas não é uma boa prática pois aumenta a chance do seu email ser considerado como spam pelos servidores, sem contar que é um limite bem baixo dependendo da sua necessidade, lembrando que enquanto escrevo este tutorial, estou trabalhando na construção de uma plataforma de email marketing.

Sendo assim, as configurações que temos neste objeto contendo as seguintes configurações de email:

  • Content.Simple: o jeito mais simples de configurar uma mensagem, enquanto que Content.Raw é o jeito mais completo e complexo, envolvendo MIME-TYPES e muito mais conteúdos que fogem do escopo deste tutorial. No modo Simple, defina o Body (podendo ser HTML ou TEXT) e o Subject. Ambos possuem a configuração de charset, que recomendo que utilize, pois o padrão é ASCII 7-bit.
  • Destination: com as opções To, Cc e Bcc, sendo que cada uma espera um array de strings com os emails dos destinatários.
  • FeedbackForwardingEmailAddress: a conta de email que vai receber o retorno deste envio, em caso de falha (delivery failure). É um jeito simples de estar a par do que está acontecendo com seus envios, enquanto que soluções mais profissionais usariam o AWS SNS para isso, como a própria Amazon recomenda.
  • FromEmailAddress: a conta do remetente de envio deste email, que já deve ter sido verificada pela Amazon antes (seção anterior aqui do tutorial). Se quiser, pode omitir esta informação, aí aparecerá no cabeçalho de email que ele foi enviado pelo SES.
  • ReplyToAddresses: a conta que receberá respostas ao email enviado.

Note que a função que criei eu deixei toda pronta para receber os dados de apenas destinatário, mas que você pode ajustar conforme necessário.

Se você executar esta função, verá que ela deve enviar a mensagem de email para o seu destinatário normalmente e que ela retorna um MessageId que você pode querer armazenar para cruzar com outras informações suas depois.

Note que uma vez que sua conta de email esteja verificada (passo #5) você já consegue mandar emails, mesmo que esteja ainda pendente de outras validações de DNS. No entanto, sem as demais validações que recomendei nas etapas #2 e #3 desta série, a sua chance de cair em spam é muito alta e/ou da Amazon bloquear seus envios.

Agora, se obteve um erro de “email address is not verified”, então volte ao passo #5 também, para garantir que o seu remetente da mensagem está devidamente configurado no console da AWS.

Importante ressaltar aqui que todas as configurações que realizamos nos tornam aptos a enviar emails de UM domínio em UMA região da AWS.

Dito isso, encerro este tutorial por aqui e espero que tenha sido útil.

Uma dica de próximo passo, é juntar o AWS SES com o AWS SQS ou RabbitMQ a fim de lidar com grandes volumes de envios. Clique nos links para ver os tutoriais.

Além disso, caso você trabalhe forte o conceito de testes unitários, pode ser útil aprender a mockar as APIs da AWS em seus testes.

Um abraço e sucesso.

Quer aprender como construir uma aplicação web completa de email marketing com vídeoaulas e tutores online? Clique no banner abaixo!

Curso FullStack

Olá, tudo bem?

O que você achou deste conteúdo? Conte nos comentários.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *