nodejs nodemailer

Como enviar e-mail com Nodemailer

Introdução

O Nodemailer é uma biblioteca do NodeJS que possibilita que o sistema, consiga realizar o envio de e-mail para um usuário.

Quase que todo sistema web atualmente, faz o envio de e-mail, seja de boas vindas, redefinição de senha, relatórios mais complexos, e-mails marketing e entre outras milhares de possibilidades.

Com isso, é essencial saber como se realiza o envio de e-mail com a linguagem que se trabalha e hoje vou mostrar como fazer com o NodeJS.

Nodemailer

A biblioteca foi criada em 2010, e atualmente é a biblioteca mais popular para este fim.

Suporta caracteres unicode, incluindo emoji, envio de anexo, conteúdo HTML, diferentes métodos de transporte e muito mais.

Para usar o Nodemailer é necessário ter o Node na versão 6 ou superior.

Como funciona o envio de e-mail

Primeiramente é necessário uma forma de transporte, que é o que enviará o e-mail. O transporte mais utilizado é o SMTP e todos os principais servidores de e-mail, implementam esse transporte.

O segundo passo é configurar quem enviará o e-mail e quem receberá este e-mail.

E o terceiro e último passo, é realizar o envio do e-mail passando todas as opções previamente configuradas.

Primeiro Exemplo

O exemplo abaixo, é o mesmo utilizado no site oficial do Nodemailer, nele é configurado o transporter, o objeto de envio e envio da mensagem.

"use strict";
const nodemailer = require("nodemailer");

async function main() {
  let testAccount = await nodemailer.createTestAccount();

  let transporter = nodemailer.createTransport({
    host: "smtp.ethereal.email",
    port: 587,
    secure: false,
    auth: {
      user: testAccount.user,
      pass: testAccount.pass,
    },
  });

  let info = await transporter.sendMail({
    from: '"Fred Foo 👻" <foo@example.com>',
    to: "bar@example.com, baz@example.com",
    subject: "Hello ✔",
    text: "Hello world?",
    html: "<b>Hello world?</b>",
  });

  console.log("Message sent: %s", info.messageId);

  console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
}

main().catch(console.error);

Exemplo de e-mail com anexo

É possível realizar isso de diversas formas, pois pode ser passa há diferentes maneiras que o Nodemailer aceita para que seja enviados anexos.

Uma das formas, é passando o caminho do arquivo que está salvo no servidor, e a configuração fica assim:

let message = {
  from: 'usuario@teste.com',
  to: 'teste@teste.com',
  subject: 'Veja os anexos',
  html: 'Estou mandando alguns anexos para testar.'
  attachments: [{
    filename: 'boleto.pdf',
    path: 'servidor/orcamentos/orcamento1.pdf'
  }]
};

Repare que a chave Attachments é um array, com isso, para enviar vários anexos, é só passar mais chaves com filename e path.

Além dessa forma, também da para enviar por Stream, Buffer, URL, encoded e entre outras.

E-mail alternativo ao HTML

Quando é enviado um e-mail, pode ser enviado um HTML para o usuário, porém cabe ao leitor de e-mail decidir qual a melhor forma de mostrar esse e-mail ao seu usuário.

Com isso, caso o leitor de e-mail não tenha suporte a HTML, pode ser passado outro tipo para que caso o HTML não possa ser exibido, o conteúdo é entregue da mesma forma.

No exemplo abaixo é enviado um e-mail com conteúdo em HTML e em Markdown, e o leitor pode escolher qual o mais adequado a ser enviado:

html: '<b>Ola mundo!</b>',
alternatives: [
    {
        contentType: 'text/x-web-markdown',
        content: '**Ola mundo!**'
    }
];

Enviar e-mail profissional

Para isso é necessário utilizar um engine de views no NodeJS, para que seja possível ler o HTML e enviar ao cliente.

O engine de views que será utilizado é o EJS, e com ele será montado um HTML simples e depois enviado para o usuário.

Para este exemplo, utilizei uma API Express com uma rota /sendmail que ao acessá-la o e-mail é enviado.

<!-- Template simples de e-mail, arquivo com o nome email.ejs -->
<header style="background-color: black; color: #ffffff; padding: 10px;">
    <h3>Seja bem vindo ao sistema</h3>
</header>
<article>
    <p>Este é o seu acesso no sistema</p>
    <p>Aproveite muito bem ele</p>
</article>
<footer style="background-color: black; color: #ffffff; padding: 10px;">
    <h4>Siga as redes sociais</h4>
</footer>
const nodemailer = require("nodemailer");
const express = require("express");
const ejs = require("ejs");

app.get("/sendmail", (req, res) => {
ejs.renderFile(__dirname + "/email.ejs", { name: 'Stranger' }, function (err, data) {
        if (err) {
            console.log(err);
        } else {
            let transporter = nodemailer.createTransport({
                host: "smtp.mailtrap.io",
                port: 2525,
                auth: {
                    user: USUARIO SMTP,
                    pass: SENHA SMTP
                }
            });

            var mainOptions = {
                from: '"Tester" teste@mail.com',
                to: "email@teste.com",
                subject: 'Hello, world',
                html: data
            };
            console.log("html data ======================>", mainOptions.html);
            transporter.sendMail(mainOptions, function (err, info) {
                if (err) {
                    console.log(err);
                } else {
                    console.log('Message sent: ' + info.response);
                }
            });
        }
    });
    res.send("enviou");
});

app.listen(3000, () => {
    console.log("Rodando ...");
});

Este e-mail irá mostrar o seguinte resultado:

nodemailer 1

Este e-mail tem uma formatação básica, mas sabendo que é possível realizar essa formatação, é dessa forma que agências e empresas fazem para enviar e-mails profissionais. Normalmente algum profissional faz a arte ou desenho do e-mail, e é passado para colocar no software que irá enviar para os clientes.

Para ver mais

Caso queira, gravei um vídeo completo com esses exemplos na prática:

Conclusão

Provavelmente, no sistema que irá trabalhar, será necessário configurar um envio de e-mail e o Nodemailer é uma excelente alternativa para esse fim, é uma biblioteca que já existe faz tempo e é a principal para este fim. Até o próximo post 🙂

Para ver outros canais onde o posto conteúdo, meu Github e também cursos, veja os Links do Programando Soluções.

Referências

https://nodemailer.com/about/

Este conteúdo te ajudou de alguma forma?