/** * Forma canonica de un correo, solo para contar limites. * * Sin esto, limitar por direccion no sirve de nada: `victima+1@gmail.com` y * `victima+2@gmail.com` son cadenas distintas y el mismo buzon, asi que quien * quisiera bombardear a alguien solo tendria que ir cambiando la etiqueta. * * IMPORTANTE: esto NO es la identidad de la cuenta. La cuenta se guarda con la * direccion tal y como la escribio su duena, porque hay proveedores donde * `+algo` o los puntos si distinguen buzones y fusionarlos crearia accesos * cruzados entre cuentas ajenas. Aqui se canoniza a proposito de mas: para * contar, pasarse de estricto solo puede hacer que un limite se comparta, que * es el lado seguro del error. */ /** Proveedores en los que los puntos del usuario no distinguen buzon. */ const IGNORAN_PUNTOS = new Set(['gmail.com', 'googlemail.com']); /** * Clave con la que contar los envios a una direccion. * * Devuelve la direccion en minusculas, sin la etiqueta `+...` y, en los * proveedores que los ignoran, sin puntos en la parte del usuario. */ export function claveDeCorreo(email: string): string { const limpio = email.trim().toLowerCase(); const arroba = limpio.lastIndexOf('@'); if (arroba <= 0) return limpio; let usuario = limpio.slice(0, arroba); const dominio = limpio.slice(arroba + 1); // La etiqueta `+algo` la ignoran practicamente todos los proveedores. const mas = usuario.indexOf('+'); if (mas > 0) usuario = usuario.slice(0, mas); if (IGNORAN_PUNTOS.has(dominio)) usuario = usuario.replaceAll('.', ''); return `${usuario}@${dominio}`; }