Punti e alias + di Gmail: come individuare le registrazioni doppie
j.doe+7@gmail.com e jdoe@gmail.com sono la stessa casella. Come funziona l'indirizzamento di Gmail, una funzione di normalizzazione in JavaScript e Python e i casi limite che creano problemi.
Una casella, indirizzi infiniti
Gmail ha due regole di indirizzamento che rendono banale creare molti account da una sola casella:
- I punti vengono ignorati. Per gli indirizzi
@gmail.com,jane.doe,janedoeej.a.n.e.d.o.esono la stessa casella. Un nome di dieci lettere ha centinaia di varianti con i punti. - Tutto ciò che segue un segno più viene ignorato.
janedoe+prova1@gmail.com,janedoe+prova2@gmail.come così via arrivano ajanedoe@gmail.com. Il numero di varianti è illimitato.
Inoltre @googlemail.com è lo stesso servizio di @gmail.com. Ogni variante supera la verifica dell'e-mail, perché il messaggio di conferma arriva davvero. Per il tuo modulo di registrazione sono tutti utenti diversi e nuovi.
L'indirizzamento con il più non è esclusivo di Gmail: lo supportano anche Fastmail e Proton Mail, come molti server di posta aziendali. Ignorare i punti, invece, è una caratteristica del Gmail personale.
Normalizza, poi confronta
La soluzione è salvare una forma normalizzata di ogni indirizzo accanto all'originale e confrontare le nuove registrazioni con quella. Conserva l'originale per l'invio della posta: è ciò che l'utente ha scritto, e alcuni usano i tag con il più per filtrare i messaggi.
// 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}"
Poi aggiungi una colonna e un indice, e interrogali alla registrazione:
ALTER TABLE users ADD COLUMN email_normalized text; CREATE INDEX users_email_normalized ON users (email_normalized); -- alla registrazione SELECT count(*) FROM users WHERE email_normalized = $1;
Casi limite che creano problemi
- Non togliere i punti fuori dal Gmail personale. Nella maggior parte dei provider, e nei domini aziendali Google Workspace,
jane.doe@ejanedoe@sono persone diverse. Togliere i punti lì unisce degli sconosciuti. - Togliere il più è un'euristica altrove. Quasi ovunque il tag con il più è un alias, ma un server di posta può trattare
+come un carattere normale. Considera una corrispondenza fuori da Gmail un segnale, non una prova. - Non rifiutare il tag con il più in sé. Molte persone attente usano
nome+servizio@gmail.comsu ogni sito. Un tag su una casella nuova è normale; un tag su una casella che ha già un account è il segnale. - Passa a minuscolo prima di confrontare, ed elimina spazi e punti finali. In pratica i provider trattano la parte locale senza distinguere maiuscole e minuscole.
- Altri provider hanno i propri schemi di alias (gli indirizzi usa e getta di Yahoo, gli alias di Outlook sullo stesso account). Non li individui con la normalizzazione: lì entrano in gioco i segnali di dispositivo e di rete.
Cosa fare in caso di corrispondenza
Una corrispondenza normalizzata significa che il nuovo account riceve posta in una casella che ha già un account da te. Di solito la risposta giusta non è un errore ma una spinta gentile: “Hai già un account con questa e-mail — vuoi accedere?”. Per prove e crediti gratuiti è anche un ottimo motivo per non concedere la prova o mandare la registrazione in verifica. Vedi Come prevenire l'abuso della prova gratuita per un flusso decisionale completo.
Come lo fa Attrelix
Ogni controllo normalizza l'indirizzo (punti di Gmail, tag con il più, googlemail.com e i domini Proton), cerca account esistenti con la stessa casella e aggiunge il motivo alias_of_existing quando ne trova uno. L'indirizzo originale non viene mai modificato nei tuoi dati, e gli account collegati sono nella risposta così vedi tutto il gruppo.
In sintesi
- Gmail ignora i punti e i tag con il più; molti provider ignorano i tag con il più.
- Salva un indirizzo normalizzato accanto all'originale e indicizzalo.
- Togli i punti solo per il Gmail personale; tratta le altre corrispondenze come segnali.
- In caso di corrispondenza proponi l'accesso e non concedere una seconda prova.