【问题标题】:How to correct email address domains which are misspelled?如何更正拼写错误的电子邮件地址域?
【发布时间】:2011-08-30 06:50:29
【问题描述】:

有时用户拼错了他们的电子邮件域,因此他们输入了错误的电子邮件地址。 例如。 abc@gmial.com 而不是 abc@gmail.com

以前有人想过这个吗?任何人都可以建议如何处理此类错误?

【问题讨论】:

  • 问题是 gmial.com 可能是一个完全有效的域名。我建议您不要尝试这样做 - 但如果您真的想这样做,请创建一个拼写错误白名单以自动更正,并且不要创建任何通用规则。
  • 尝试这样做的麻烦在于,您最终可能会向错误的人发送电子邮件并惹恼潜在客户。
  • @Prescott,几乎所有拼写检查器都是如此。我希望他不是在寻找自动更正,这当然是一个失误。
  • 您可以尝试检查 MX 记录,如果它有效 - 发送电子邮件并查看响应消息/NDR,如果有问题 - 尝试自动更正。
  • 常见的错别字列表在服务器端非常有用且易于实现。正如 alttag 所建议的那样,自从提出这个问题后,已经创建了一些 javascript 代码(mailcheck),效果非常好。它向用户显示他们的域可能拼写错误,并让他们选择更新它。这绕过了所有似乎认为自动更改电子邮件地址有什么不好的人。

标签: php email dns


【解决方案1】:

谁能建议如何处理这类错误?

您通常会向给定地址发送一封确认电子邮件,并且只有在单击该电子邮件中的链接后才能继续。

没有其他好的方法可以解决这个问题 - 无法确定 gmial.com 是否是拼写错误,因为它是一个有效的域。

【讨论】:

  • +1 确认电子邮件是最好的。您经常看到的另一件事是让他们输入两次(希望他们不知道如何复制/粘贴)。
  • Google 也不可能知道您的查询拼写是否正确,但它通常可以建议替换以改进查询。
  • @Captain 这里的魔法词是肯定。当然,在接受gmial.com 地址和其他常见拼写错误之前,没有人反对建议更正,但这是真的。为您的建议 +1
  • 检查输入的主机名和常用主机名列表之间的 Levenstein 距离,如果距离 = 1,请用户确认。
【解决方案2】:

问这个问题时它不存在,但我推荐MailCheck,它会自动建议更正输入的电子邮件。它已被大公司成功使用。

【讨论】:

【解决方案3】:

创建常用电子邮件域名列表:

hotmail.com
gmail.com
googlemail.com
... etc

当用户输入电子邮件地址时,获取输入地址的域名并获取列表之间的 Levenstein 距离。如果距离为 1(或最大为 2),则要求用户确认这是他们所指的电子邮件地址。

【讨论】:

  • 先生,这是一个非常好的方法 - 谢谢!
【解决方案4】:

在我看来,为通用案例提出通用解决方案几乎是不可能的。

话虽如此,最常见的拼写错误是互换两个相邻的字母。 所以你可能想检查最大的网站 gmail、yahoo 和你有什么的字符内容;基于此,如果原件与 gmail 等不匹配,则建议使用替代拼写。

  • 不要假设用户有错,如果与常用名称相比,它看起来可疑,请建议替代方案。另一个回复中提到了白名单。
  • 如果您需要知道可以从该地址获得回复,请使用确认邮件。 您不能假设您找到的拼写错误,这就是确认邮件的用途。
  • 让它非常不显眼(想到 ajax)。

【讨论】:

    【解决方案5】:

    在我们的表单中,我们使用了多种技术。虽然不良数据仍然可以通过,但机会大大减少。

    首先是做一个通常可用的简单格式化正则表达式 - 只要确保它符合 RFC。如果失败,此时最好向用户提供确认表单,因为他们可能会在解决此问题时为您发现其他错误。

    下一部分是检查域的 TLD 部分。由于所有 TLD 都是已知的,因此使用一些正则表达式测试相对容易扫描这些 TLD 以查找拼写错误。只需将所有当前 TLD 的列表保存在某个表中,并根据需要不时对其进行更新(请注意,在处理国际 TLD 时,此列表可能会变得复杂。如果您只处理美国流量,则规则很多更容易,这是您可以过滤掉的其他内容。例如,如果您销售仅在美国提供的服务,则在提交表单时过滤掉国际电子邮件是有意义的。我们是,所以这对我们有用) .

    第三个是像@npclaudiu 建议的那样做 - 扫描域部分中大牌邮件主机(gmail、hotmail、yahoo 等)的常见拼写错误,如果检测到可能的命中,提供确认表用户。 (你输入了someone@hptmail.com,你是说hotmail.com吗?)

    如果您完成了这些步骤,则可以执行@symcbean 建议的 MX 查找。

    最后,如果所有这些都成功了,还有一种方法(但我还没有测试过)可以与远程 SMTP 主机进行通信,以查看邮箱是否存在。我们即将开始自己测试。我在这里找到了这样的方法: http://www.webdigi.co.uk/blog/2009/how-to-check-if-an-email-address-exists-without-sending-an-email/

    【讨论】:

    • 我编写了一个 C/C++ 库来检查电子邮件地址的有效性。电子邮件地址的 RFC 非常复杂,很难用正则表达式实现(如果你真的想接受 RFC 支持的所有内容。)我的库是免费的,可以在这里找到:snapwebsites.org/project/libtld——我也认为禁止使用国际电子邮件地址是“危险的”,因为我可以拥有诸如 alexis@alexiswilke.me 之类的电子邮件,而 .me 不是美国域名(尽管在这里广泛使用,例如 .co、.fm、.ws 等)我的 TLD表有 7075 个条目......这也一定很复杂!
    【解决方案6】:

    有趣的是,网址确实存在http://www.gmial.com 事实上,您很难知道这是一个错误还是只是一个“奇怪”的域。查看 Google API,因为当您在 Google 中输入错误时,他们会提示您“您的意思是……”

    祝你好运

    阿尔诺

    【讨论】:

      【解决方案7】:

      您不能以自动更正拼写错误的电子邮件域名的方式提供此功能,因为您认为无效的名称将是有效的。您应该期望输入任何内容作为电子邮件地址域名。

      我建议,如果您正在创建一个注册表单,您可以为用户提供一个下拉列表,其中包含您知道的所有可能的域名,以便他可以从中进行选择。

      希望这会有所帮助。

      【讨论】:

        【解决方案8】:

        您可以在您的数据库中创建一个流行电子邮件域(gmail.com、yahoo.com、ymail.com 等)的列表,并根据该列表验证用户输入的电子邮件地址,如果域类似于这些域之一,您应该显示警告并允许用户在必要时更正它,而不是自动更正它。并且要将输入的域与列表中的域进行比较,您可能会使用类似于 SQL Server 中 soundex 函数中使用的算法,该算法根据一个单词是否听起来像来匹配单词第二个。

        编辑:你可以找到more details the SOUNDEX function here

        【讨论】:

        • soundex 域名?!我想知道这将如何与 flickr.com 之类的名称一起使用...如果我改为输入 flickr.com,SQL 会找到它吗?
        【解决方案9】:

        如前所述,自动假设某人输入了错误的电子邮件并不是一个好主意。更好的方法是实现一个小的 javascript 函数来检查电子邮件的域是否可能输入错误并提醒用户,而不是从一开始就假设他们是错误的。

        给我一​​点时间来创建一个小模型。

        编辑:好的,所以可能超过一分钟。查看http://jsbin.com/iyaxuq/8/edit 并亲自了解 javascript 如何帮助防止常见的输入错误。尝试使用以下电子邮件:test@gmail.cmo、another@yhaoo.com、loser@htomali.ocm(hotmail 的错字)和 me@aol.com。

        注意:我使用惰性正则表达式来验证电子邮件。不要依赖它(或者就此而言,大多数正则表达式)来开发真正的应用程序。

        【讨论】:

          【解决方案10】:

          试图自动纠正不良数据是一种非常危险的做法。最终,只有用户才能提供正确的数据。然而,关于格式化电子邮件地址有严格的规定——正则表达式检查可以在 javascript 中运行(或使用具有相同正则表达式语法的 preg 函数)——但请注意,在互联网上有很多声称要解决的正则表达式不好的例子问题。

          这应该是一个相当完整的 RFC2822 ADDR_SPEC 验证器实现:

          /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/gi
          

          但在实践中我觉得这样就足够了:

          /^[a-z0-9\._%+!$&*=^|~#%'`?{}/\-]+@([a-z0-9\-]+\.){1,}([a-z]{2,22})$/gi
          

          然后,在服务器端,您可以通过MX lookup 验证提供的域不仅满足格式要求,而且作为电子邮件接收站点存在。

          这并不能证明指定邮箱存在于该站点,也不能证明它正在接受电子邮件 - 最终您需要向该地址发送一封电子邮件,包括点击返回链接/密码以确定该电子邮件地址是否有效.

          更新

          虽然正如此处投票最多的答案所说,验证 ADDR_SPEC 的最佳方法是将令牌发送到要通过网络提交回的地址,但如果数据不是来自控制邮箱的人,并且即使他们这样做,该操作也与主要交互分离。进一步的考虑是,今天有效的电子邮件地址可能明天就不再有效。

          使用正则表达式(和 MX 查找)仍然是向用户提供即时反馈的好主意,但要获得完整的解决方案,您还需要 monitor the bounces

          【讨论】:

            猜你喜欢
            • 2018-05-23
            • 2019-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-20
            • 1970-01-01
            • 2018-09-09
            相关资源
            最近更新 更多