如何安全地确定电子邮件地址是否在列表中



我的任务是编写一个系统来确定所提供的电子邮件地址是否在列表中。检查字符串是否在列表中通常是一项简单的任务,但电子邮件地址很复杂。例如,如果我向personname@gmail.comperson.name@gmail.com发送一封电子邮件,两封电子邮件将到达同一个帐户。据我所知,用户可以通过其他几种方式使用两个不同的电子邮件地址字符串,最终到达所来的帐户(用下划线替换句点,在用户名后添加+字符,改变字母大小写等)。

该系统的用户有动机提供多个电子邮件地址,这些地址欺骗了列表检查,但却导致了同一个帐户(personname@gmail.comperson.name@gmail.com)。我想找到一些方法来确定两个电子邮件地址是否都会导致相同的电子邮件提供商帐户(最好是Python,尽管我可以移植任何解决方案)。

我的第一个解决方案是尝试列举前面提到的技巧,并将它们颠倒过来,以使电子邮件地址成为某种常见的形式。例如,删除所有下划线和点,删除第一个+和@符号之间的所有内容,并将电子邮件转换为全小写。问题是,我不能100%确定这是所有可能的技巧的详尽列表,我也不知道这些技巧是否适用于所有提供商。是否有比这种方法更稳健的库或执行这种检查的常用方法?我是不是不得不执行这些有限的检查,然后吃掉聪明用户成功欺骗我的系统的成本?

不幸的是,您描述的行为完全取决于电子邮件提供商。Gmail可能会忽略某些字符,但其他提供商不会,这意味着你的规则可能会产生虚假匹配。SMTP规范RFC 5321 2.3.11明确表示,您不能对电子邮件提供商如何解释电子邮件地址做出任何假设,因为处理完全取决于他们(粗体突出显示):

地址通常由用户和域规范组成。
标准邮箱命名约定定义为"local-part@domain";现代用法允许更广泛的应用程序比简单的";用户名";。因此,由于当中间主机尝试通过修改它们来优化传输,本地部分必须仅由中指定的主机解释和分配语义地址的域部分

所以没有通用的电子邮件规则。你能做的最好的事情就是为每个电子邮件提供商使用一套单独的规则,这可能会给你带来一些成功,但解决方案永远不会完美。

相关内容

最新更新