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

时间:2019-01-17 22:07:59

标签: python email-validation

我受命编写一个系统,该系统确定列表中是否提供了电子邮件地址。检查字符串是否在列表中通常很容易,但是电子邮件地址却很复杂。例如,如果我向personname@gmail.comperson.name@gmail.com发送电子邮件,则这两封电子邮件将到达同一帐户。据我了解,用户还有其他几种方式可以使用户拥有两个不同的电子邮件地址字符串,这些字符串最终会到达用户帐户(用下划线替换句点,在用户名后添加+字符,改变字母大小写,等等)。

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

我的第一个解决方案是尝试枚举上述技巧并将其反转以将电子邮件地址转换为某种常见形式。例如,删除所有下划线和点,删除第一个+和@符号之间的所有内容,然后将电子邮件转换为所有小写字母。问题是,我不确定100%是否列出所有可能的技巧,也不知道这些技巧是否适用于所有提供商。是否存在执行这种检查的库或常用方法比该方法更强大?我是否必须坚持执行这些有限的检查,然后吃掉更聪明的用户设法成功欺骗我的系统的成本?

1 个答案:

答案 0 :(得分:-1)

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

  

地址通常由用户和域规范组成。
  标准邮箱命名约定定义为   “ local-part @ domain”;当代用法允许更广泛的使用   应用程序比简单的“用户名”。因此,由于   中间主机尝试解决问题的悠久历史   通过修改它们来优化运输,必须在本地   仅由在   地址的域部分

因此,没有针对电子邮件的通用规则。最好的办法是为每个电子邮件提供商使用一套单独的规则,这可能会给您带来一些成功,但是解决方案将永远不会是完美的。