Pontos e aliases com + no Gmail: como pegar cadastros duplicados
j.doe+7@gmail.com e jdoe@gmail.com são a mesma caixa. Como funciona o endereçamento do Gmail, uma função de normalização em JavaScript e Python e os casos de borda que dão problema.
Uma caixa, endereços infinitos
O Gmail tem duas regras de endereçamento que tornam trivial criar muitas contas a partir de uma única caixa:
- Pontos são ignorados. Em endereços
@gmail.com,jane.doe,janedoeej.a.n.e.d.o.esão a mesma caixa. Um nome de dez letras tem centenas de variações com pontos. - Tudo depois de um sinal de mais é ignorado.
janedoe+teste1@gmail.com,janedoe+teste2@gmail.come assim por diante entregam emjanedoe@gmail.com. O número de variações é ilimitado.
Além disso, @googlemail.com é o mesmo serviço que @gmail.com. Toda variação passa na verificação de e-mail, porque o e-mail de confirmação chega de verdade. Para o seu formulário de cadastro, são todos usuários diferentes e novinhos.
O endereçamento com mais não é exclusivo do Gmail: Fastmail e Proton Mail também suportam, assim como muitos servidores de e-mail de empresas. Já ignorar pontos é coisa específica do Gmail pessoal.
Normalize e depois compare
A solução é guardar uma forma normalizada de cada endereço ao lado do original e comparar os cadastros novos com ela. Mantenha o original para enviar e-mails — foi o que o usuário digitou, e algumas pessoas usam a tag de mais para filtrar mensagens.
// JavaScript function normalizeEmail(input) { const raw = input.trim().toLowerCase(); const at = raw.lastIndexOf("@"); if (at < 1) return null; let local = raw.slice(0, at); let domain = raw.slice(at + 1).replace(/\.$/, ""); if (domain === "googlemail.com") domain = "gmail.com"; const plus = local.indexOf("+"); if (plus > 0) local = local.slice(0, plus); if (domain === "gmail.com") local = local.replaceAll(".", ""); return `${local}@${domain}`; } normalizeEmail("J.Doe+trial7@GoogleMail.com"); // "jdoe@gmail.com"
# Python def normalize_email(value: str) -> str | None: raw = value.strip().lower() local, sep, domain = raw.rpartition("@") if not sep or not local: return None domain = domain.rstrip(".") if domain == "googlemail.com": domain = "gmail.com" base = local.split("+", 1)[0] or local if domain == "gmail.com": base = base.replace(".", "") return f"{base}@{domain}"
Depois adicione uma coluna e um índice, e consulte no cadastro:
ALTER TABLE users ADD COLUMN email_normalized text; CREATE INDEX users_email_normalized ON users (email_normalized); -- no cadastro SELECT count(*) FROM users WHERE email_normalized = $1;
Casos de borda que dão problema
- Não tire pontos fora do Gmail pessoal. Na maioria dos provedores, e nos domínios de empresa do Google Workspace,
jane.doe@ejanedoe@são pessoas diferentes. Tirar os pontos ali junta desconhecidos. - Tirar o mais é uma heurística nos outros provedores. Em quase todos, a tag de mais é um alias, mas um servidor de e-mail pode tratar
+como um caractere comum. Trate uma coincidência fora do Gmail como sinal, não como prova. - Não recuse a tag de mais em si. Muita gente cuidadosa usa
nome+servico@gmail.comem todo site onde se cadastra. Tag de mais numa caixa nova é normal; tag de mais numa caixa que já tem conta é o sinal. - Passe para minúsculas antes de comparar, e tire espaços e pontos finais. Na prática, os provedores tratam a parte local sem diferenciar maiúsculas.
- Outros provedores têm seus próprios esquemas de alias (endereços descartáveis do Yahoo, aliases do Outlook na mesma conta). Esses não se pegam com normalização — é aí que entram sinais de dispositivo e rede.
O que fazer quando bate
Uma coincidência normalizada significa que a conta nova recebe e-mail numa caixa que já tem conta com você. Geralmente a resposta certa não é um erro, e sim um empurrão: “Você já tem uma conta com este e-mail — quer entrar?”. Para testes e créditos grátis, também é um forte motivo para não dar o teste ou mandar o cadastro para revisão. Veja Como evitar abuso do teste grátis para um fluxo de decisão completo.
Como o Attrelix faz
Toda checagem normaliza o endereço (pontos do Gmail, tags de mais, googlemail.com e os domínios do Proton), procura contas existentes com a mesma caixa e adiciona o motivo alias_of_existing quando encontra. O endereço original nunca é alterado nos seus dados, e as contas ligadas vêm na resposta para você ver o grupo inteiro.
Resumo
- O Gmail ignora pontos e tags de mais; muitos provedores ignoram tags de mais.
- Guarde um endereço normalizado ao lado do original e indexe.
- Tire pontos só no Gmail pessoal; trate as outras coincidências como sinais.
- Quando bater, sugira entrar na conta e não dê um segundo teste.