【问题标题】:How can I safely determine if an email address is in a list?如何安全地确定电子邮件地址是否在列表中?
【发布时间】:2019-06-12 04:29:51
【问题描述】:

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

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

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

【问题讨论】:

  • personnameperson.name 没有到达同一个电子邮件帐户
  • 可能有一个已发布的电子邮件地址格式规范描述了哪些是有效的别名,哪些不是。您不必费心检查电子邮件提供商是否支持它,因为您可以合理地假设它不会将它们视为不同的地址(它可能不会发送它们)。一旦你有了规范,你创建一个规范的电子邮件列表并进行检查的想法就有意义了。
  • 据我所知,您描述的技巧适用于 Gmail 地址,但在一般电子邮件中并不常见。其他服务可能已采用它们,但可能有许多将person.name@example.compersonname@example.com 视为不同的地址。
  • 这是一个非常广泛的问题,不太适合 SO ——您可能需要查看文档并尝试将其缩小到特定的内容(尤其是代码级别),您遇到了麻烦和。然而,在高层次上,简单的答案是“不”。没有一种通用的、可靠的方法可以通过检查它们所组成的字符串来确定一堆电子邮件地址是否最终在同一个邮箱中。无论您正在构建什么,都应尽量避免依赖于这样的过程。
  • 你正在做的是试图找到没有模式的地方。当然,你总会在随机性中找到一些。

标签: python email-validation


【解决方案1】:

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

地址通常由用户和域规范组成。
标准邮箱命名约定被定义为 “本地部分@域”;当代使用允许更广泛的集合 应用程序比简单的“用户名”。因此,并且由于 中间宿主试图解决问题时的长期问题 通过修改它们来优化传输,本地部分必须是 仅由指定的主机解释和分配语义 地址的域部分

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

【讨论】:

    猜你喜欢
    • 2017-07-23
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2017-05-17
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多