SMTP Gmail no Nodemailer: Configuração, Envio de Email e Limitações

On junho 13, 2024
12min read
Piotr Malek Technical Content Writer @ Mailtrap
Ivan Djuric, an author at Mailtrap
Ivan Djuric Technical Content Writer @Mailtrap

Vamos diretos ao ponto: você quer enviar emails com Nodemailer e Gmail, e estou aqui para mostrar como fazer isso, passo a passo.

Vou incluir algumas informações adicionais que você pode achar úteis, como as limitações do Gmail e algumas alternativas que você pode usar.

Como enviar emails usando Nodemailer e Gmail SMTP

Aqui está o que você precisará para enviar emails com sua conta do Gmail e Nodemailer:

  • Node.js e npm (Node Package Manager) – Presumo que você já tenha esses dois instalados se estiver lendo este artigo, mas se não tiver, aqui está um guia útil do npm que pode ajudar.
  • Uma senha de app – No passado, você poderia ativar o acesso a Apps menos seguros para usar suas credenciais do Gmail em apps de terceiros. No entanto, como esse recurso não será mais suportado a partir de setembro de 2024, teremos que usar uma senha de app, que permite utilizar o SMTP do Gmail para envio de emails.

1. Criando uma senha de app

Para criar uma senha de app, siga estes passos:

  • Faça login na sua Conta do Google.
  • Clique em Segurança e role para baixo até a seção Como você faz login no Google:
Como você faz login no Google
  • Selecione Verificação em duas etapas e insira sua senha quando solicitado.
    • Caso esteja desativada, ative-a.
  • Role até o final da página e selecione Senhas de app.
  • Escolha um nome para sua senha de app.
  • Clique em Criar e armazene sua nova senha de app com segurança.

Importante: Não se esqueça de armazenar sua senha de app com segurança após gerá-la, pois ela não será mostrada novamente.

2. Configurando seu projeto

Em seguida, vamos preparar a base para nosso backend de envio inicializando o Node.js e criando nosso arquivo package.json que contém metadados importantes sobre o projeto.

Para isso, use o seguinte comando:

npm init -y 

Então, vamos instalar o Nodemailer com o comando npm ou Yarn:

npm install nodemailer

# ou

yarn add nodemailer

Finalmente, no diretório do seu projeto, crie um diretório src com um arquivo index.js dentro dele, que conterá nossa configuração do Nodemailer.

Seu diretório de projeto deve ficar algo assim:

Estrutura do diretório de projeto

3. Configurando Nodemailer para Gmail

E agora, tudo o que resta fazer é inserir suas credenciais do Gmail e a senha de app na configuração do Nodemailer.

Para isso, cole o seguinte snippet de código no arquivo index.js e substitua os placeholders pelas suas credenciais do Gmail e senha de app:

// Importe a biblioteca Nodemailer
const nodemailer = require('nodemailer');

// Crie um objeto transportador
const transporter = nodemailer.createTransport({
  host: 'smtp.gmail.com',
  port: 587,
  secure: false, // use false para STARTTLS; true para SSL na porta 465
  auth: {
    user: 'SEU_ENDERECO_GMAIL',
    pass: 'SUA_SENHA_DE_APP',
  }
});

// Configure o objeto mailOptions
const mailOptions = {
  from: 'seunomeusuario@email.com',
  to: 'seuamigo@email.com',
  subject: 'Enviando Email usando Node.js',
  text: 'Isso foi fácil!'
};

// Envie o email
transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log('Erro:', error);
  } else {
    console.log('Email enviado: ', info.response);
  }
});

Para salvar e executar o script, use o seguinte comando:

node src/index.js

Observe que você pode configurar diferentes tipos de callbacks nas últimas seções do código. Em vez de apenas ser notificado quando uma mensagem falha ao ser entregue, você pode, por exemplo, receber um array incluindo o endereço do destinatário junto com a resposta do servidor. Veja todas as opções disponíveis aqui.

4. Criar variáveis de ambiente (opcional)

Embora este passo seja opcional, é uma das práticas de segurança que sempre recomendo. Nomeadamente, armazenar suas credenciais em variáveis de ambiente é muito mais seguro do que salvá-las diretamente em seu código.

Pense nisso como usar um cofre no banco em vez de guardar seu dinheiro debaixo do colchão. Se alguém invadir sua casa (Deus nos livre), você quer seu dinheiro no banco em vez de em um lugar óbvio para qualquer ladrão amador. 🏦

Tudo o que você precisa fazer é criar um arquivo .env no diretório raiz, que conterá suas variáveis de ambiente.

Em seguida, adicione suas credenciais do Gmail (ou qualquer outra informação sensível) ao seu recém-criado arquivo .env. Por exemplo:

GMAIL_USER=seu-email@gmail.com
GMAIL_PASS=sua-senha-de-app

Proceda instalando o pacote dotenv que será responsável por carregar as variáveis de ambiente do seu arquivo .env para process.env. Para isso, você pode usar o confiável npm:

npm install dotenv

Nota: A partir da versão 20.6.0, o Node.js tem suporte nativo para arquivos .env para configurar variáveis de ambiente. Então, não é necessário usar o pacote dotenv, mas muitos projetos ainda dependem do dotenv, então ainda é o padrão de fato.

Por fim, no seu arquivo index.js (ou onde você decidir configurar o Nodemailer), carregue as variáveis de ambiente no início do arquivo exigindo o dotenv. O início da sua configuração do Nodemailer deve ficar algo assim:

require('dotenv').config();                              // Carregar variáveis de ambiente do arquivo .env
const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: process.env.GMAIL_USER,             // Seu endereço Gmail do arquivo .env 
    pass: process.env.GMAIL_PASS,             // Sua senha de app do Gmail do arquivo .env
  }
});

// Configure o objeto mailOptions
const mailOptions = {
  from: process.env.GMAIL_USER,               // Endereço do remetente do arquivo .env
  to: 'seuamigo@email.com',
  subject: 'Enviando Email usando Node.js',
  text: 'Isso foi fácil!'
};

// Envie o email
transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log('Erro:', error);
  } else {
    console.log('Email enviado: ', info.response);
  }
});

Enviar emails em HTML

Anteriormente, mostrei como enviar um email de texto simples. No entanto, enviar email HTML no Nodemailer é bastante simples, pois você pode simplesmente adicionar o campo html às opções da mensagem e usar as tags apropriadas (ex: <h1>, <p>, etc.).

Veja:

const mailOptions = {
  from: 'seuemail@email.com',
  to: 'seuamigo@yahoo.com',
  subject: 'Enviar email HTML usando Node.js é moleza',
  text: 'Isso foi fácil!',
  html: '<h1>Bem-vindo</h1><p>Isso foi fácil!</p>'
}

Além de texto e HTML, você também pode adicionar qualquer tipo de dado como conteúdo do corpo principal (como Markdown).

Por exemplo:

let message = {
    ...
    html: '<b>Olá mundo!</b>',
    alternatives: [
        {
            contentType: 'text/x-web-markdown',
            content: '**Olá mundo!**'
        }
    ]
}

Dica: Com o campo alternatives, você pode adicionar quantas alternativas desejar.

Enviar emails para múltiplos destinatários

Com Nodemailer, enviar emails para múltiplos destinatários é bastante simples, pois você pode adicionar quantos endereços de destinatários desejar no mesmo campo to, assim:

const mailOptions = {
  from: 'seuemail@email.com',
  to: 'seuamigo@example.com, seusegundoamigo@example.com, seuamigodoamigo@example.com',
  subject: 'Enviando Email usando Node.js',
  text: 'Isso foi fácil!'
}

Enviar emails com anexos

Para enviar anexos, você pode usar a opção attachments no objeto da mensagem.

Veja como:

let message = {
    ...
    attachments: [
        {   // string utf-8 como anexo
            filename: 'texto1.txt',
            content: 'hello world!'
        },
        {   // buffer binário como anexo
            filename: 'texto2.txt',
            content: Buffer.from('hello world!','utf-8')
        },
        {   // arquivo no disco como anexo
            filename: 'texto3.txt',
            path: '/caminho/para/arquivo.txt' // transmitir este arquivo
        },
        {   // nome do arquivo e tipo de conteúdo são derivados do caminho
            path: '/caminho/para/arquivo.txt'
        },
        {   // stream como anexo
            filename: 'texto4.txt',
            content: fs.createReadStream('arquivo.txt')
        },
        {   // definir tipo de conteúdo personalizado para o anexo
            filename: 'texto.bin',
            content: 'hello world!',
            contentType: 'text/plain'
        },
        {   // usar URL como anexo
            filename: 'licenca.txt',
            path: 'https://raw.github.com/nodemailer/nodemailer/master/LICENSE'
        },
        {   // string codificada como anexo
            filename: 'texto1.txt',
            content: 'aGVsbG8gd29ybGQh',
            encoding: 'base64'
        },
        {   // data uri como anexo
            path: 'data:text/plain;base64,aGVsbG8gd29ybGQ='
        },
        {
            // usar nó MIME pré-gerado
            raw: 'Content-Type: text/plain\r\n' +
                 'Content-Disposition: attachment;\r\n' +
                 '\r\n' +
                 'Hello world!'
        }
    ]
}

Enviar emails em massa

Para enviar email em massa com Nodemailer e Gmail, você pode usar o seguinte código que preparei para você:

const nodemailer = require('nodemailer');


// Configure o Nodemailer para usar Gmail para SMTP com conexão agrupada
const transporter = nodemailer.createTransport({
   host: 'smtp.gmail.com',
   port: 587,
   pool: true, // Use o agrupamento SMTP para manter a conexão aberta para vários emails
   auth: {
       user: 'seu-usuario-gmail', // Substitua pelo seu nome de usuário do Gmail
       pass: 'sua-senha-de-app'  // Substitua pela sua senha de app
   },
   maxMessages: Infinity, // Permitir um número ilimitado de mensagens por conexão
   maxConnections: 5 // Limitar o número de conexões simultâneas
});


// Lista de destinatários para envio em massa
const recipients = [
   {email: 'destinatario1@example.com', name: 'Destinatário Um'},
   {email: 'destinatario2@example.com', name: 'Destinatário Dois'},
   {email: 'destinatario3@example.com', name: 'Destinatário Três'},
   // Adicione mais destinatários conforme necessário
];

// Preparar promessas de email para envio em massa
const emailPromises = recipients.map(recipient =>
   transporter.sendMail({
       from: '"Nome do Remetente" <remetente@example.com>',
       to: `${recipient.name} <${recipient.email}>`, // Personalizado para cada destinatário
       subject: 'Teste de Email em Massa',
       text: 'Este é um email de teste enviado em massa usando Nodemailer e Gmail.',
       html: `<b>Olá ${recipient.name},</b><p>Este é um email de teste enviado em massa usando Nodemailer e Gmail.</p>`
   })
);

// Enviar todos os emails em paralelo e tratar os resultados
Promise.all(emailPromises)
   .then(results => {
       console.log('Todos os emails foram enviados com sucesso');
       results.forEach(result => {
           console.log(`Mensagem para ${result.envelope.to} enviada: ${result.messageId}`);
       });
   })
   .catch(errors => {
       console.error('Falha ao enviar um ou mais emails:', errors);
   });

Explicação do código:

  • Este snippet de código configura o Nodemailer com o Gmail para enviar emails em massa de forma eficiente usando o agrupamento SMTP. Ao configurar maxMessages para Infinity e limitar as conexões simultâneas a cinco, ele otimiza o uso da conexão e melhora o desempenho.
  • A configuração pool: true mantém as conexões SMTP abertas para múltiplos envios, reduzindo a sobrecarga e melhorando o processo de envio de emails.

Importante: Como o Gmail possui várias limitações de envio, que abordarei na seção a seguir, você deve considerar o uso de um provedor de serviços de email dedicado para envios em massa (por exemplo, Mailtrap).

Limitações do Gmail SMTP e possíveis problemas

Como mencionei, o Google tem limitações oficiais para garantir o uso justo e proteger sua infraestrutura.

Algumas das limitações incluem:

  • Limites diários de envio

Contas normais do Gmail podem enviar tipicamente cerca de 100-150 emails por dia. Se você incluir três destinatários, como fizemos acima, isso já conta como três emails enviados. Se você enviar três emails separados para os mesmos destinatários, ainda serão três emails.

Por outro lado, contas do Google Workspace podem ter limites mais altos (até 2.000 emails por dia). Agora, isso seria perfeitamente adequado para enviar atualizações ocasionais do sistema ou emails transacionais.

No entanto, se você tiver campanhas de marketing em massa em mente ou milhares de usuários para enviar emails, provavelmente desejará procurar soluções mais sofisticadas projetadas para envio de email em massa. Nossa lista dos melhores provedores de email transacional pode ser útil.

  • Limite de tamanho de anexos

Enviar anexos com Nodemailer é fácil, mas enviar um único email com mais de 25 MB via servidor SMTP do Gmail não é tão fácil, receio. Para enviar arquivos maiores, você terá que usar o Google Drive e inserir o link no email.

  • Problemas de autenticação

Um dos problemas que você pode enfrentar é com autenticação. “Impossível”, você pode estar pensando depois de todos os passos que mostrei para configurar sua conta. Infelizmente, o Google fará o seu melhor para dificultar a vida dos spammers, e usuários honestos como eu e você muitas vezes acabam sofrendo.

Para evitar possíveis problemas, use OAuth2 com Gmail e Nodemailer. Siga estas instruções.

  • Problemas de localização do servidor

Se isso não fosse suficiente, você também pode ter problemas se seus servidores estiverem em uma localização geográfica diferente. O Google é facilmente capaz de detectar tal comportamento e pode marcar sua atividade como suspeita, tornando difícil o envio de qualquer email.

Finalmente, você pode enfrentar problemas de entregabilidade ao enviar mensagens de servidores publicamente disponíveis. Há um bom número de spammers e fraudadores utilizando contas do Gmail e até mesmo do Google Apps, e isso tudo afeta a reputação dos domínios de envio.

  • Falta de suporte humano

Mesmo com todos os problemas potenciais em jogo, contas básicas do Gmail e planos do Workspace não oferecem suporte ao cliente dedicado, que está disponível apenas para planos de níveis mais altos. Então, infelizmente, sua melhor aposta para resolver qualquer problema relacionado ao Gmail são fóruns comunitários como o Stack Overflow.

Observe que essas limitações estão sujeitas a alterações e são regularmente atualizadas pelo Google.

Existe uma alternativa ao SMTP do Gmail?

Agora, como superar as limitações do Gmail SMTP? Não se preocupe — tenho a solução perfeita para desenvolvedores com a qual você mantém a funcionalidade contínua do Nodemailer e obtém uma infraestrutura com altas taxas de entregabilidade por design.

Claro, estou falando sobre o Email API/SMTP do Mailtrap, parte da Plataforma de Email Delivery do Mailtrap projetada para testar, enviar e controlar sua infraestrutura de email.

O Email API/SMTP do Mailtrap possui um cliente Node.js oficial que você pode usar para adicionar rapidamente funcionalidade de envio de emails à sua aplicação Node.js, utilizando SMTP ou a API oficial de email. Para um guia rápido, confira nosso guia dedicado.

Para garantir que seus emails alcancem as caixas de entrada desejadas a tempo, o Mailtrap também oferece uma infinidade de recursos destinados a melhorar a entregabilidade.

Destaques dos benefícios de usar Mailtrap:

  • Entregabilidade confiável – A infraestrutura do Mailtrap é otimizada para alta entregabilidade, permitindo que você envie 10 000 emails por segundo.
  • Escalabilidade – Com o Mailtrap, você não é restrito por limites diários de envio, pois você pode enviar desde alguns emails por dia até milhões, tudo depende de você. Você pode facilmente crescer suas necessidades operacionais e enviar um grande volume de emails sem comprometer a qualidade do seu serviço ou enfrentar problemas de desempenho.
  • Segurança aprimorada – O Mailtrap segue as práticas de envio de email mais seguras da indústria, como usar criptografia SSL/TLS.
  • Infraestrutura de email gerenciada – O Mailtrap cuidará de análises, escalonamento e estabilidade da sua infraestrutura para você. Sua infraestrutura é adequada para empresas de todos os tamanhos, especialmente aquelas que usam emails como canal de comunicação.
  • Análises detalhadas – Ao contrário da infraestrutura do Gmail, o Mailtrap fornece análises detalhadas e dashboards de visão panorâmica, permitindo que você verifique facilmente suas taxas de abertura, taxas de rejeição, taxas de cliques e mais.
Visão geral das estatísticas de envio de email do Mailtra
  • Registros detalhados de email – Com o Mailtrap, você pode ver até 60 dias de registros de email, facilitando suas tarefas de depuração e rastreamento.
  • Streams Transacionais e em Massa – Ao contrário do SMTP do Gmail, com o Mailtrap você pode enviar emails transacionais (por exemplo, redefinições de senha e cadastros) com o Stream Transactional ou usar o Bulk para enviar emails de marketing além dos transacionais sem comprometer sua entregabilidade sem custo adicional.
  • Equipe de suporte ao cliente dedicada – Com o Mailtrap, você não precisa contar com fóruns comunitários para suporte, pois temos uma equipe de especialistas que trabalham 24 horas para ajudar com qualquer problema que você encontrar ou responder a qualquer pergunta que você possa ter.

Mais importante ainda, configurar o Email API/SMTP do Mailtrap é super simples e leva apenas cinco minutos graças ao seu processo de configuração contínuo!

Guia de configuração do Nodemailer para o serviço SMTP do Mailtrap:

Verifique sua configuração
  • Adicione os registros DNS fornecidos pelo Mailtrap ao DNS do seu provedor de domínio para verificar a propriedade do domínio.
Verificação
  • Uma vez verificado seu domínio, vá para a aba Integration e escolha a configuração do stream SMTP baseada em suas necessidades.
Configurações SMTP/API
  • Copie as credenciais fornecidas pelo Mailtrap (Host, Porta, Nome de Usuário, etc.) para seu arquivo de configuração do Nodemailer, mais especificamente, no objeto transportador.

E é basicamente isso!

Testar emails e envio de emails em staging

Se você é desenvolvedor, provavelmente está ciente de que uma única linha de código com erro pode causar um erro que dá dor de cabeça.

Agora, para evitar enviar emails com erros e evitar a dor de cabeça que vem ao corrigir o código com falha, aconselho você a testar seus emails antes de enviá-los. Isso é uma prática padrão da indústria que acompanha qualquer ciclo sólido de envio de emails como arroz no feijão. 🍚

Para isso, recomendo o Email Testing do Mailtrap, outra parte inseparável da Plataforma de Email Delivery do Mailtrap.

Com o Email Testing do Mailtrap, você pode inspecionar e depurar emails em ambientes de staging, dev e QA sem risco de spam de usuários com emails de teste.

Algumas funcionalidades do Email Testing do Mailtrap que se destacam incluem:

  • Pré-visualização de email – Veja como seus emails HTML se parecem antes de enviá-los, ou visualize-os em HTML de origem, texto, bruto e mais.
Pré-visualização de email do Mailtrap
  • Verificação HTML – Analise o HTML/CSS dos seus emails e facilmente identifique linhas de código com falha. Dessa forma, você pode garantir que seus emails estejam livres de qualquer erro potencial no código e que pareçam perfeitos em qualquer navegador/cliente de email.
Verificação HTML do Mailtrap
  • Análise de Spam – Verifique sua pontuação de spam e mantenha-a abaixo de 5 para reduzir significativamente suas chances de encontrar problemas de entregabilidade quando seu app passar para produção.
Análise de Spam do Mailtrap
  • Templates de email – Teste seus emails com nossa API e depois mude facilmente de staging para produção quando achar que está pronto, economizando tempo na criação de suas campanhas.
Templates de email do Mailtrap
  • Múltiplas caixas de entrada – Com o Email Testing do Mailtrap, você obtém múltiplas caixas de entrada para diferentes projetos e estágios, o que permite compartilhar facilmente o processo de teste com seus membros da equipe, criar novos projetos e adicionar múltiplos objetos dentro deles.
Meus projetos do Mailtrap

Agora, deixe-me mostrar como funciona o Email Testing do Mailtrap e como configurá-lo!

Primeiro, registre-se para uma conta gratuita do Mailtrap se você ainda não tiver uma, e então:

  • Vá para Email Testing e selecione sua caixa de entrada.
  • Copie as credenciais da aba Integration.
  • Insira as credenciais no seu arquivo de configuração do Nodemailer.

Ou, você também pode usar a integração pronta para uso do Mailtrap com Nodemailer:

  • Selecione Nodemailer na lista de integrações.
  • Copie e cole o snippet no seu código de aplicação.

O snippet de código contém atributos transporter e syntaxis, e fica algo assim:

const transport = nodemailer.createTransport({
  host: "sandbox.smtp.mailtrap.io",
  port: 2525,
  auth: {
    user: "1a2b3c4d5e6f7g",
    pass: "1a2b3c4d5e6f7g"
  }
});

Alternativamente, você pode integrar o Email Testing no seu app e usar a API de Teste para testar, automatizar e testar sequências automatizadas.

Concluindo

Isso é tudo pessoal! (Inserir a música do Looney Tunes aqui)

Como prometido, mostrei como enviar emails com Nodemailer e Gmail SMTP, e, como você pôde ver, não é uma ciência super complicada. 🧪

No entanto, você sempre pode seguir a rota mais fácil (e mais eficiente) optando pelo Mailtrap, evitando as limitações do Gmail e garantindo que seus emails sejam entregues onde e quando devem ser.

Além disso, se você quiser apimentar sua jornada de codificação e aprender mais sobre JavaScript, confira nosso blog, onde você pode encontrar artigos como:

Article by Piotr Malek Technical Content Writer @ Mailtrap
Ivan Djuric, an author at Mailtrap
Article by Ivan Djuric Technical Content Writer @Mailtrap

I’m a Technical Content Writer with 5 years of background covering email-related topics in tight collaboration with software engineers and email marketers. I just love to research and share actionable insights with you about email sending, testing, deliverability improvements, and more. Happy to be your guide in the world of emails!