Orientação de produto
Verificação de e-mail em Node.js: Indo além do Regex para verificações de entregabilidade
Crie uma verificação de e-mail em Node.js que analisa o formato localmente, chama uma API de entregabilidade no servidor e trata cada resultado de forma clara.

Um fluxo de serviço em Node.js para verificação de e-mail: análise de formato local, verificação de entregabilidade no lado do servidor e tratamento claro de cada resultado.
A verificação de e-mail em Node.js funciona melhor como duas camadas no servidor. Primeiro, normalize a entrada e analise seu formato localmente, para que erros de digitação óbvios nunca saiam do seu processo. Segundo, chame uma verificação de entregabilidade, como o POST /api/v1/check do EmailCheckPro, a partir do código do servidor com um tempo limite, e ramifique com base em três resultados: entregável, não entregável ou indeterminado. Um regex sozinho apenas informa se um endereço parece correto; a verificação de entregabilidade informa se ele poderia receber e-mail no momento da verificação, sem enviar nada para ele. Links de confirmação permanecem como uma etapa separada para consentimento e propriedade.
O que a verificação de e-mail em Node.js geralmente significa
Pesquise sobre este tópico e a maioria dos tutoriais mostrará um regex ou uma rota Express que envia um link de confirmação por e-mail. Ambos são úteis, mas respondem a perguntas diferentes, e misturá-los causa bugs.
| Camada | Pergunta que responde | Onde é executada |
|---|---|---|
| Análise de formato | O dado de entrada parece um endereço completo? | Seu processo Node.js, sem chamada de rede |
| Verificação de entregabilidade | O endereço poderia receber e-mail no momento da verificação? | Uma chamada de API no lado do servidor |
| Link de confirmação | A pessoa controla a caixa de entrada e concorda em receber mensagens? | Um e-mail que você envia, mais uma rota de token |
Este guia cobre as duas primeiras camadas, que são executadas antes de você enviar qualquer coisa. Elas complementam, em vez de substituir, um fluxo de confirmação. O padrão reflete a verificação da camada de serviço em outros frameworks: o navegador pode dar dicas rápidas, mas a decisão pertence ao servidor, onde a chave de API e o resultado armazenado residem.
Passo 1: normalize e analise o formato
Comece com uma função pequena e previsível. Remova espaços em branco, descarte a pontuação final que muitas vezes aparece de textos copiados, coloque o domínio em minúsculas e deixe a parte local como foi digitada. Em seguida, teste o resultado em relação a um padrão abrangente.
// Padrão do padrão HTML WHATWG para entradas type="email"
const EMAIL_PATTERN = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
export function normalizeEmail(raw) {
const trimmed = String(raw ?? '').trim().replace(/[.,;:]+$/, '');
const at = trimmed.lastIndexOf('@');
if (at < 1 || at === trimmed.length - 1) return null;
const email = trimmed.slice(0, at) + '@' + trimmed.slice(at + 1).toLowerCase();
return EMAIL_PATTERN.test(email) ? email : null;
}
O padrão vem do padrão HTML WHATWG, a mesma regra que os navegadores aplicam aos campos type="email", para que cliente e servidor concordem. Se você preferir um pacote mantido, isEmail no validator.js é uma escolha comum; escolha uma fonte de verdade e use-a em todos os lugares.
Erros comuns nesta camada:
- Padrões excessivamente rigorosos que rejeitam tags
+, domínios de nível superior longos ou subdomínios. A orientação da OWASP recomenda aceitar uma ampla gama de formatos válidos e rejeitar apenas entradas claramente malformadas. - Colocar todo o endereço em minúsculas. Domínios não diferenciam maiúsculas de minúsculas, mas alterar a parte local altera o que o usuário digitou.
Passo 2: chame a verificação de entregabilidade do servidor
O Node.js 18 e versões posteriores possuem um fetch global, portanto, nenhuma biblioteca HTTP é necessária. A chamada deve ser executada no servidor: a chave de API consome o saldo da conta e nunca deve chegar ao código do navegador.
const API_BASE = process.env.EMAILCHECK_API_BASE; // da documentação da API
export async function checkDeliverability(email) {
try {
const res = await fetch(`${API_BASE}/api/v1/check`, {
method: 'POST',
headers: buildHeaders(), // cabeçalhos de autenticação exatamente como documentado
body: buildCheckBody(email), // corpo da requisição exatamente como documentado
signal: AbortSignal.timeout(4000) // seu próprio orçamento de tempo
});
return await toOutcome(res); // 'deliverable' | 'undeliverable' | 'undetermined'
} catch (err) {
return 'not_completed'; // TimeoutError, erro de rede, etc.
}
}
buildHeaders, buildCheckBody e toOutcome são auxiliares simples que você escreve a partir da documentação da API do EmailCheckPro, para que a autenticação e os detalhes dos campos fiquem em um só lugar e sigam o contrato publicado. toOutcome deve retornar palavras simples em vez de passar objetos de resposta brutos pelo seu código.
AbortSignal.timeout() interrompe a requisição após o orçamento que você escolher e gera um TimeoutError, o que evita que uma rede lenta congele um formulário de inscrição. A referência do fetch no Node.js lista as opções suportadas. Escolha o tempo limite de acordo com a tolerância do seu próprio formulário; o valor acima é um exemplo, não um valor de serviço.
A Verificação de entregabilidade de e-mail aceita endereços em praticamente qualquer domínio. Se o produto precisar de avatares públicos, a Verificação de avatar de e-mail é limitada aos domínios Gmail, Yandex e Mail.ru, portanto, encaminhe outros domínios para o produto de entregabilidade.
Passo 3: trate os resultados entregável, não entregável e indeterminado
Modele o resultado como um pequeno conjunto de estados e deixe o formulário decidir a partir daí:
export async function screenSignupEmail(raw) {
const email = normalizeEmail(raw);
if (!email) return { ok: false, message: 'Por favor, verifique o formato do e-mail.' };
const outcome = await checkDeliverability(email);
await saveCheck({ email, outcome, checkedAt: new Date() });
switch (outcome) {
case 'deliverable': return { ok: true, email };
case 'undeliverable': return { ok: false, message: 'Este endereço não pôde receber e-mail. Por favor, use outro.' };
default: return { ok: true, email, flagged: true }; // indeterminado ou não concluído
}
}
Por que cada ramificação se comporta como se comporta:
- Entregável significa que o endereço poderia receber e-mail no momento da verificação. Continue e armazene a data com o resultado.
- Não entregável significa que não poderia. Peça outro endereço com uma linguagem amigável; não acuse o usuário de inserir um endereço falso.
- Indeterminado cobre endereços que não podem ser definidos de nenhuma das formas, como endereços Catch-All. A API em tempo real retorna um código de negócio em vez de um resultado para eles, e eles não são cobrados. Aceite o endereço com uma sinalização em vez de adivinhar.
- Não concluído cobre tempos limite e erros de rede. Permitir que o usuário continue com uma sinalização evita que um problema temporário bloqueie uma inscrição real.
Um trabalho em segundo plano pode verificar novamente as linhas sinalizadas mais tarde, e o e-mail de confirmação que você já envia resolverá muitas delas.
Verificando mais de um endereço a partir do Node.js
Formulários de inscrição verificam um endereço, mas ferramentas administrativas e importações geralmente contêm muitos. Dois caminhos documentados os cobrem.
Até 100 endereços de uma vez. POST /api/v1/batch-check aceita de 1 a 100 endereços e retorna resultados na mesma resposta, na ordem de entrada. Divida arrays maiores em blocos de 100 e associe cada resposta de volta ao seu bloco por posição. Cada item informa se um resultado concluído existe; um item sem um pertence à ramificação indeterminado ou não concluído, nunca à não entregável.
Arquivos preparados. Para exportações e migrações, escreva um arquivo TXT ou CSV com um endereço completo por linha e envie-o com POST /api/v1/bulk-tasks. A tarefa é executada de forma assíncrona, portanto, verifique o status a partir de um worker, não de um manipulador de requisições:
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function waitForTask(taskRef) {
for (;;) {
const status = await getTaskStatus(taskRef); // GET /api/v1/bulk-tasks/{id}
if (status.done) return status; // sucesso ou falha
await sleep(30_000); // nunca verifique mais rápido que isso
}
}
Uma tarefa bem-sucedida fornece um CSV de resultados em um link de download que dura 12 horas; consultar a mesma tarefa novamente retorna um link atualizado. Linhas inválidas e duplicadas são removidas durante a preparação, portanto, mescle os resultados de volta por endereço de e-mail em vez de número da linha. Os limites de tarefa por produto estão listados na documentação da API.
Checklist de produção para uma integração Node.js
- Segredos: leia a chave de API do ambiente ou de um gerenciador de segredos e mantenha-a fora de logs e relatórios de erro.
- Cache: armazene o resultado com sua data e reutilize-o dentro da sua própria janela de re-verificação, para que editar um nome de perfil não dispare uma nova chamada.
- Seu próprio endpoint: se o aplicativo expuser uma rota de verificação de endereço, adicione limitação de taxa e respostas consistentes para que ela não possa ser usada para investigar quais contas existem.
- Filas: execute re-verificações de linhas sinalizadas a partir de uma fila de trabalho com um atraso e um limite de tentativas, em vez de tentar novamente dentro da requisição.
- Testes: faça testes unitários na
normalizeEmailcom tags de mais, subdomínios, espaços finais e domínios ausentes, e teste cada ramificação de resultado com umacheckDeliverabilitysimulada para que o texto da interface seja revisado antes do lançamento. - Ferramentas de IA: equipes que também trabalham com assistentes de IA podem usar o endpoint MCP em
https://emailcheckpro.com/mcppara verificações únicas e até 100 endereços, enquanto tarefas baseadas em arquivos permanecem na API REST.
Perguntas frequentes
Um regex é suficiente para verificação de e-mail em Node.js?
Um regex é suficiente para detectar entradas malformadas, e deve ser executado primeiro porque não tem custo. Equipes que precisam saber se um endereço é entregável adicionam uma verificação no lado do servidor após o regex e mantêm o link de confirmação para consentimento e propriedade.
A verificação de entregabilidade deve ser executada no navegador ou no servidor?
No servidor. A chave de API consome o saldo compartilhado da conta, portanto, expô-la no código front-end permite que qualquer pessoa a use. Uma rota de servidor também pode aplicar seus próprios limites de taxa, armazenar o resultado com uma data e decidir como tratar verificações indeterminadas ou com tempo limite. O navegador ainda pode mostrar dicas instantâneas de formato usando o mesmo padrão WHATWG.
Como as equipes podem evitar bloquear usuários reais quando uma verificação é indeterminada?
Aceite o endereço com uma sinalização em vez de rejeitá-lo. Resultados indeterminados, como endereços Catch-All, não são evidências de que um endereço é ruim e não são cobrados. Uma conta sinalizada ainda pode receber o e-mail de confirmação; um trabalho posterior pode verificá-la novamente, e pipelines de envio podem reter linhas sinalizadas até que um resultado concluído ou um clique de confirmação seja registrado.
Saiba mais
Escolha as informações do produto que se encaixam na próxima etapa do seu fluxo de trabalho.