如何纠正拼写错误的电子邮件地址域


How to correct email address domains which are misspelled?

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

以前有人想过这个问题吗?谁能建议一下如何处理这类错误?

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

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

您通常会向给定的地址发送一封确认电子邮件,只有当该电子邮件中的链接已被单击时才会继续。

没有其他好的方法来处理这个问题——不可能确定gmial.com是否是一个打字错误,因为它是一个有效的域。

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

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

当用户输入电子邮件地址时,取输入地址的域名并取列表之间的Levenstein距离。如果距离是1(或者可能是2),然后让用户确认这是他们想要的电子邮件地址。

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

话虽如此,最常见的拼写错误是互换了两个相邻的字母。所以你可能想要检查字符内容的最大的网站gmail,雅虎和你有什么;在此基础上,建议一个替代拼写,如果原来的不匹配gmail等。

  • 不要认为用户有错,如果与常用名称相比看起来可疑,建议替代名称。在另一个回复中提到了白名单。
  • 使用确认邮件,如果你需要知道你可以从这个地址得到答复。您不能假定您发现的拼写是错误的,这就是确认邮件的作用。
  • 让它非常不引人注目(想到ajax)。

有趣的是url确实存在http://www.gmial.com事实上,你很难知道这是一个错误的域名还是一个"陌生"的域名。看看谷歌的API因为当你在谷歌里输入错误的东西时他们会问你"你的意思是....吗"

好运

Arnaud

在我们的表单中,我们使用了多种技术的组合。虽然坏数据仍然可以通过,但几率大大降低了。

首先是做一个简单的格式化正则表达式,这是通用的——只是要确保它是rfc兼容的。如果失败,此时最好向用户提供一个确认表单,因为他们可能会在解决此问题时为您捕获其他错误。

下一步是检查域的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/

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

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

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

编辑:你可以在这里找到更多关于SOUNDEX函数的细节。

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

给我一分钟来创建一个小模型。

EDIT:好吧,也许不止一分钟。看看http://jsbin.com/iyaxuq/8/edit,自己看看javascript是如何帮助防止常见的输入错误的。试试这样的邮件:test@gmail.cmo, another@yhaoo.com, loser@htomali.ocm (hotmail的错别字)和me@aol.com。

注意:我使用了一个惰性正则表达式来验证电子邮件。对于真正的应用程序,不要依赖于它(或大多数正则表达式)。

试图自动纠正错误数据是一种非常危险的做法。最终,只有用户才能提供正确的数据。然而,关于格式化电子邮件地址有严格的规则——正则表达式检查可以在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查找,以验证所提供的域不仅满足格式要求,而且作为电子邮件接收站点存在。

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

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

使用正则表达式(和MX查找)向用户提供即时反馈仍然是一个好主意,但是对于一个完整的解决方案,您还需要监视反弹。

Email Spell Checker是alttag 2013年的回答中提到的Mail Check JavaScript库的继承者。MailCheck现在已经被废弃了,它有几个重要的bug:

是@spmsupun,这个库不再维护(自上次更新以来已有7年),还包含一些这样或这样的错误。

我完全重写了它,并为2022年及以后更新了它,开放给贡献者:https://github.com/ZooTools/email-spell-checker

连README上链接的域名都要过期了。

根据Email拼写检查器的开发人员,对mailcheck.js的改进包括:

- Written in TypeScript and removed jQuery
- Reduced bundle size to <2KB.
- Update TLDs (69+) and added modern startup domains (like .io, .so, .xyz or .dev)
- Implemented suggestions that people made [to mailcheck.js] that were ignored