Use esta checklist de validação de e-mail para escolher onde validar no cadastro, retornar erros claros, evitar bloquear usuários reais e manter o fluxo testável.

A validação de e-mail no cadastro impede que endereços ruins entrem no seu banco de dados desde o início. Isso evita rebotes, resets de senha falhos, trabalho extra de suporte e danos à entregabilidade que se acumulam ao longo do tempo.
Use checagens no cliente para erros rápidos e corrigíveis pelo usuário, como ausência de @, espaços antes/depois ou formatos claramente inválidos. Coloque todas as regras aplicáveis no servidor, porque verificações no navegador são fáceis de burlar e você não deve expor chaves de API ou decisões de política no cliente.
A sintaxe apenas diz se o e-mail parece um endereço. Checagens de domínio e MX informam se o domínio existe e está configurado para receber e-mails, o que é um sinal muito mais forte de alcançabilidade, mas ainda não prova que a caixa postal específica existe.
Comece aparando espaços e normalizando o domínio para letras minúsculas. Mantenha a parte local exatamente como o usuário digitou, porque alterá-la pode mudar o significado em alguns sistemas.
Use um conjunto pequeno de resultados que você possa explicar e implementar consistentemente, como permitir, bloquear e avisar. Avisos funcionam bem em casos incertos ou de risco médio, onde você quer manter usuários reais avançando mas ainda exigir confirmação ou impor limites até a verificação.
Detectar descartáveis é uma decisão de política, não uma falha técnica. Se seu produto recebe muitas promoções ou tende a abuso, bloquear descartáveis no cadastro costuma ser o mais simples. Se tem receio de rejeitar usuários legítimos, permita o cadastro mas restrinja ações sensíveis até que um e-mail não-descartável seja confirmado.
Defina um timeout curto e escolha o fallback com antecedência. Se a validação expirar, não diga que o e-mail é inválido; ofereça tentar novamente ou permita o cadastro em um estado pendente e reavalie em segundo plano, dependendo da sua tolerância ao risco.
Mostre mensagens simples e corrigíveis para problemas de sintaxe, e mantenha mensagens de risco genéricas. Usuários não precisam de nomes de blocklists ou detalhes de provedores; salve esses detalhes como códigos internos para que suporte e engenheiros possam depurar sem ensinar atacantes a contornar suas checagens.
Registre o mínimo necessário para depurar e medir resultados. Um padrão prático é: um hash unidirecional do e-mail, o domínio, um status de resultado, alguns códigos de razão, um timestamp e um ID de requisição ou tentativa de cadastro — em vez de salvar sempre a entrada bruta em todos os logs.
Coloque a validação por trás de uma interface pequena e retorne um tipo de resultado estável como valid, invalid, risky ou unknown. Teste a lógica de política com respostas predefinidas do validador e mocque a rede em testes de integração para manter os testes rápidos e determinísticos.
O cadastro é onde endereços de e-mail ruins entram no seu sistema. Depois que eles são salvos, criam trabalho: resets de senha que falham, chamados ao suporte, campanhas com rebotes e uma base de usuários bagunçada. Uma checklist de validação ajuda a decidir o que bloquear imediatamente, o que avisar e o que apenas registrar.
Muitos problemas são erros humanos simples. Pessoas digitam errado domínios (gamil.com), esquecem parte do endereço ou colam espaços extras. Detecte esses erros rapidamente porque são fáceis de corrigir e poupam o usuário de um loop frustrante.
O próximo grupo é de endereços de baixa qualidade ou arriscados. Alguns domínios não existem, não têm configuração de e-mail ou nunca aceitarão mensagens. Outros são provedores descartáveis usados para pegar trials e sumir. Você também pode ver armadilhas de spam e padrões ligados a abuso. Esses são os que, silenciosamente, prejudicam entregabilidade e reputação do remetente ao longo do tempo.
Boa validação é um equilíbrio:
Onde você valida importa porque muda tanto a experiência do usuário quanto a segurança.
Checagens no cliente dão feedback instantâneo para erros de digitação, mas são fáceis de burlar. Checagens no servidor são aplicáveis, mas aumentam a latência e precisam de tratamento claro de erros. Checagens em segundo plano ajudam quando você não quer atrasar o cadastro, mas não devem se tornar uma fonte silenciosa de dados ruins.
Combine expectativas com sua equipe desde o começo: validação reduz risco, não garante certeza. Mesmo um e-mail tecnicamente válido e entregável pode depois falhar (inbox cheio, conta desativada). E alguns e-mails com aparência arriscada pertencem a usuários reais.
Exemplo: um usuário digita [email protected]. Detecte isso imediatamente e sugira a correção. Mas se o usuário informar um endereço válido em um domínio descartável, você tem uma escolha de política: bloqueá-lo no cadastro para evitar abuso, ou permitir com limitações para não rejeitar um usuário legítimo.
A validação de e-mail não é uma checagem só. É uma pilha de checagens pequenas que respondem questões diferentes. Mantenha as camadas separadas para poder agir sobre o resultado sem adivinhar o que falhou.
As camadas comuns em uma checklist de validação de e-mail:
@, espaços, caracteres inválidos e outros erros de formatação. Isso não diz se o endereço existe.example.com) é real e tem registros DNS.admin@) ou padrões que você considera arriscados. Trate isso como política, não verdade absoluta.Algumas checagens são seguras para rodar instantaneamente no navegador. Outras pertencem ao servidor.
Checagens de sintaxe são rápidas e confiáveis, por isso funcionam bem no cliente para feedback imediato. DNS e MX geralmente também são rápidos, mas dependem da rede e do resolvedor, então trate falhas e timeouts como normais. Correspondência com provedores e blocklists costuma ser rápida se você usa um bom serviço, mas seu código precisa de timeout e fallback.
Um modelo mental útil: erros de formatação são claros e corrigíveis pelo usuário. Sinais de alcançabilidade e risco (DNS, MX, flags de descartável) são probabilísticos. Use-os para decidir o que permitir, avisar ou revisar.
Para privacidade, trate e-mails como dados sensíveis. Registre com cuidado e evite armazenar strings brutas de "entrada ruim" só porque a validação falhou. Se precisar de logs de depuração, mantenha-os mínimos (por exemplo: um e-mail com hash, código de razão e ID da requisição).
Onde você valida importa tanto quanto o que validar. Uma boa configuração usa três lugares, cada um com uma função diferente.
Validação no cliente é para velocidade e clareza. Limite-a a erros óbvios: falta de @, espaços, pontos duplos ou formato claramente quebrado. Ajuda o usuário, mas não é segurança.
Validação no servidor é a fonte da verdade. Todas as regras reais pertencem aqui porque o servidor é o único lugar que você controla. Também é onde você pode chamar uma API de validação de e-mail com segurança, sem expor chaves. É aqui que você faz checagens mais profundas (domínio, MX, provedores descartáveis, blocklists) e decide aceitar, rejeitar ou pedir confirmação.
Valide antes de criar o registro do usuário sempre que possível. Se você criar contas primeiro e validar depois, vai acumular usuários falsos, desperdiçar e-mails de boas-vindas e abrir espaço para abuso.
Checagens em segundo plano são opcionais, mas úteis. O status de um e-mail muda com o tempo (domínios expiram, caixas são desativadas, provedores entram em listas descartáveis). Rechecagens em segundo plano ajudam também quando o e-mail é editado depois.
Mantenha a divisão simples:
Se fizer rechecagens, salve um pequeno resumo de validação com o usuário (status, motivos, timestamp). Isso evita chamadas repetidas a cada login e facilita o suporte.
Um bom fluxo de cadastro checa o que é fácil primeiro, e só gasta tempo e chamadas de API quando importa.
Comece normalizando o que o usuário digitou. Remova espaços no começo e no fim. Decida como tratar espaços internos (muitas equipes os rejeitam). Coloque em minúsculas apenas a parte do domínio (exemplo: [email protected] vira [email protected]). Mantenha a parte local como está para evitar alterar o significado.
Em seguida, faça checagens básicas de sintaxe e pare cedo em falhas óbvias. Esse é seu filtro mais barato: um @, sem caracteres proibidos, comprimento razoável, domínio não vazio. Se falhar, mostre uma mensagem simples como "Digite um endereço de e-mail válido" e não chame serviços externos.
Só depois disso chame um serviço de validação de e-mail para saber o que a sintaxe não diz: o domínio existe, tem registros MX, é descartável ou fonte conhecida de armadilhas. Trate essa chamada como parte do caminho crítico. Defina um timeout curto e escolha um fallback claro.
A maioria das equipes se beneficia de um pequeno conjunto de resultados:
Exemplo: um app consumidor com muitos cupons pode bloquear descartáveis para reduzir abuso promocional. Um produto B2B pode permitir, mas exigir e-mail corporativo confirmado antes de permitir convites de equipe.
Finalmente, registre um resumo curto do que aconteceu para que suporte e engenheiros possam depurar sem salvar mais do que o necessário: e-mail normalizado, resultado (allow/block/warn), alguns códigos de razão (syntax, no_mx, disposable), tempo de resposta e timestamp.
Tratamento de erros é onde boa validação pode parecer ruim. O objetivo é ajudar pessoas reais a corrigir erros rapidamente, ao mesmo tempo em que bloqueia endereços que prejudicam a entregabilidade.
Separe "você pode corrigir isto" de "não aceitamos isto". Se o problema for sintaxe, diga em palavras claras. "O e-mail deve incluir um símbolo @" é melhor que "E-mail inválido" porque diz ao usuário o que mudar.
Para sinais de risco que não são certos, considere um aviso em vez de bloqueio rígido. Se um e-mail parece descartável, permita o cadastro mas exija confirmação antes de ações importantes, ou limite recursos sensíveis até que um e-mail melhor seja adicionado.
Evite expor sua lógica interna de detecção. Usuários não precisam dos nomes de blocklists ou da lista de provedores. Mantenha a mensagem da UI genérica ("Use um e-mail real e alcançável") e guarde os detalhes nos logs.
Consistência importa. Use um pequeno conjunto de códigos de erro que seu frontend trate sempre da mesma forma e que seus logs possam filtrar facilmente:
EMAIL_SYNTAX: mostrar mensagem corrigívelEMAIL_UNREACHABLE: bloquear (domínio sem configuração de e-mail)EMAIL_RISKY: avisar ou bloqueio suaveEMAIL_TIMEOUT: oferecer nova tentativaTimeouts merecem cuidado especial porque muitas vezes não são culpa do usuário. Se a validação expirar, não acuse o usuário de ter digitado algo errado. Diga algo como: "Não foi possível verificar seu e-mail agora. Por favor, tente novamente." Forneça um caminho claro de retry, e considere permitir o cadastro em um estado de "verificação pendente" se seu produto suportar.
Exemplo: um usuário digita jane.doe@gmail e toca em Cadastrar. A UI pode capturar o TLD faltante e mostrar uma dica curta. Se a sintaxe estiver ok mas o servidor marcar o e-mail como arriscado, a mensagem para o usuário deve focar no próximo passo: "Tente outro e-mail ou continue e confirme depois."
Mantenha a validação do cadastro sustentável separando três coisas: chamar o serviço de validação, decidir o que fazer com o resultado e registrar o ocorrido. Quando esses pontos se misturam dentro de um controller ou handler, pequenas mudanças de política viram refactors arriscados.
Comece com um tipo de resultado mínimo e estável que seu app entenda. Trate-o como a única coisa da qual o resto do código depende, mesmo se você trocar de provedor depois.
export type EmailValidationResult =
| { status: "valid" }
| { status: "invalid"; reason?: string }
| { status: "risky"; reason?: string }
| { status: "unknown"; reason?: string };
Separe decisões de política da chamada de API. O cliente da API deve traduzir a resposta do provedor para EmailValidationResult. Um módulo de política decide se bloqueia, avisa ou permite com base nas regras do seu produto.
Faça a parte de rede segura por padrão. Defina timeouts curtos, tente novamente uma vez para falhas transitórias e defina comportamento de fallback. Por exemplo: se a validação expirar, retorne unknown e continue o cadastro, em vez de falhar todo o fluxo.
Cache resultados por pouco tempo para evitar consultas repetidas durante a mesma tentativa. Um cache de 5 a 15 minutos com chave no e-mail normalizado pode evitar chamadas duplicadas quando usuários reenviam ou atualizam a página. Não trate o cache como verdade permanente.
Por fim, adicione métricas leves para detectar problemas cedo. Acompanhe contagens de valid/invalid/risky/unknown, timeouts e retries, bloqueios vs avisos e rebotes posteriores (para comparar resultados de validação com entregabilidade real).
Se a validação de e-mail estiver ligada direto no seu controller e fizer chamadas de rede reais, os testes ficam lentos e instáveis. Trate a validação como uma dependência, não um efeito colateral.
Coloque o validador atrás de uma interface pequena que o código de cadastro consome. Em produção, essa interface chama seu provedor de validação. Nos testes, troque por um falso que retorna respostas predefinidas. Isso mantém os testes unitários rápidos e facilita reproduzir falhas.
Teste a lógica de política separadamente da rede. Coloque tomada de decisão em uma função que recebe um resultado simples (valid, risky, unknown, error) e retorna o que o app deve fazer (allow, block, allow-with-warning, require-confirmation). Exercite essa função com uma tabela de casos.
Para testes de integração, mantenha o mínimo e determinístico. Um caminho feliz e um caminho bloqueado costumam ser suficientes. Mocque o validador na fronteira HTTP (ou com um stub local) para que os testes nunca dependam da rede real.
Se você tem retries, evite tempo real e backoff aleatório em testes unitários. Injete um relógio e a política de backoff para testar "após 2 retries nós paramos" sem esperar.
A maioria dos erros na validação de cadastro não é sintaxe. É o que você faz quando o sinal é incompleto e como mantém o fluxo rápido.
Uma armadilha comum é tratar validação como um interruptor sim/não. Se você bloquear todo endereço que não esteja 100% certo, rejeitará usuários reais (falsos positivos). Separe "definitivamente ruim" (sintaxe quebrada, domínio inexistente, descartável conhecido) de "incerto" (problemas de rede temporários, sinais ambíguos). Para casos incertos, deixe o usuário continuar mas exija confirmação antes de acesso total.
Outra armadilha é confiar apenas em checagens do navegador. Verificações no cliente ajudam, mas são fáceis de burlar. Repita checagens importantes no servidor.
DNS pode ser instável. Se uma busca expirar, tratá-la como falha permanente frustra usuários. Classifique problemas de rede/DNS como re-tentáveis. Salve o cadastro, marque o e-mail como verificação pendente e reavalie em segundo plano.
Algumas regras práticas previnem a maioria dos problemas:
Um produto B2B SaaS oferece 14 dias de trial. O cadastro é centrado no e-mail: o usuário informa o e-mail, recebe um código de confirmação e só então define a senha. O objetivo é barrar lixo óbvio sem bloquear pessoas que digitam errado.
Uma política simples resolve para a maioria das equipes: aceite endereços claramente válidos, bloqueie descartáveis e avise em resultados incertos, permitindo ao usuário corrigir o problema.
1) Erro de digitação: [email protected]
Mostre uma mensagem amigável inline: "Quis dizer [email protected]?" e deixe o usuário editar. Ainda não crie a conta.
No backend, rode sintaxe e checagens de domínio e então use seu serviço de validação para confirmar domínio e MX. Se parecer um erro de digitação, retorne um erro de validação estruturado e (opcionalmente) a sugestão.
2) Descartável: [email protected]
Mostre um bloqueio claro: "Use um e-mail de trabalho. Provedores descartáveis não são permitidos." Mantenha curto e não acuse o usuário de fraude.
Backend: corresponde a um descartável, bloqueia cadastro, não envia e-mail de confirmação e não cria workspace.
3) Corporativo válido: [email protected]
Mostre: "Verifique sua caixa de entrada para um código." Backend: valide sintaxe, cheque MX, aceite, crie um usuário pendente (não verificado), envie o código de confirmação e ative o trial apenas após confirmação.
Isso funciona bem porque cada decisão se baseia em um resultado claro, não em um amontoado de regras ad hoc.
Mantenha logs úteis sem replicar endereços inteiros em todo lugar. Um conjunto razoável:
Assegure que as checagens importantes ocorram no servidor. Validações na UI pegam erros cedo, mas são fáceis de contornar. O servidor deve decidir se um e-mail pode criar conta.
Decida o que fazer quando a validação for lenta. Defina um timeout claro (por exemplo, algumas centenas de milissegundos até alguns segundos) e escolha uma política consistente: permitir e sinalizar a conta, avisar e pedir retry, ou re-tentar uma vez em segundo plano.
Uma checklist compacta de lançamento:
Para erros, separe o que você registra do que mostra. Usuários devem receber orientação simples ("Verifique se há erros de digitação" ou "Tente outro e-mail"). Os logs podem guardar códigos detalhados para suporte e analytics.
Se quiser uma API que retorne sinais em múltiplas etapas (sintaxe, domínio, MX e correspondência a descartáveis/blocklists), ferramentas como Verimail podem manter seu código de cadastro focado em política em vez de infraestrutura. Se estiver avaliando opções, Verimail está disponível em verimail.co.
Adicione um pequeno indicador no dashboard: quantos cadastros foram bloqueados, avisados ou permitidos com sinalização. Esse loop de feedback mostra rápido se sua política está muito rígida ou muito frouxa.