如何更正拼写错误的电子邮件地址域名?

11
有时候用户会拼写错误他们的电子邮件域名,因此输入错误的电子邮件地址。 例如:abc@gmial.com而不是abc@gmail.com
有人之前想过这个问题吗?能否建议如何处理这种类型的错误?

9
问题在于"gmial.com"可能是一个完全有效的域名。我建议您不要尝试这样做,但如果您真的想要这样做,可以创建一个拼写错误白名单以自动更正,并且不要创建任何通用规则。 - Prescott
尝试这样做的麻烦在于你可能会给错误的人发送电子邮件,从而惹恼潜在客户。 - Ed Heal
1
@Prescott,这对于几乎任何拼写检查器都是正确的。我希望他不是在寻找自动更正,因为这当然是一个错误的步骤。 - Captain Giraffe
1
您可以尝试检查MX记录,如果它是有效的-发送电子邮件并查看响应消息/ NDR,如果有任何问题-尝试自动更正。 - XzKto
1
服务器端常见打字错误列表会非常有用且易于实现。但是如alttag所建议的,自从这个问题被提出以来,一些JavaScript代码(邮件检查)已经被创建,它的效果非常好。它向用户展示了他们的域名可能被拼错了,并让他们选择更新。这就避免了你们中那些认为在电子邮件地址自动更改方面存在某些邪恶的人。 - Ben C
11个回答

13

2023更新

@hashim-aziz指出MailCheck已经被放弃了一段时间,并推荐使用EmailSpellChecker.js

(链接到他们的答案)

我仍然相信JavaScript的“你确定吗?”解决方案是用户体验最好的,其次是确认电子邮件。当您发送确认电子邮件时,请务必包含一个“不是我的”选项。 使用您的网站分析来定制您的建议列表。

之前的回答

在提问时它还不存在,但我建议使用MailCheck,它会自动提供对输入电子邮件的纠正建议。 它已被大公司成功使用。


1
如果您需要AngularJS包装器,请查看此答案AngularJs指令为拼写错误的电子邮件提供建议,此外还有这个。 - nikib3ro
3
这个问题被标记为“php”,但这是一个 JavaScript 库。 - Flimm
1
@Flimm 但仅仅因为楼主想要一个PHP答案,并不意味着这对他们来说是最好的答案,也不适用于通过谷歌搜索到这个问题的人。我认为在客户端处理这个问题会带来更好的用户体验。 - Hashim Aziz
1
JavaScript是处理这个问题的最佳方式,但MailCheck已经被放弃了将近十年,并且不支持许多现在常见的域名。相反,可以考虑使用Email Spell Checker - Hashim Aziz

12

有人能建议如何处理这种错误吗?

通常会向给定的地址发送确认电子邮件,并仅在该电子邮件中的链接被点击后才继续。

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


1
+1 确认邮件是最好的。你经常看到的另一种方法是让他们输入两次(希望他们不会知道如何复制/粘贴)。 - Thilo
1
Google也无法确定您的查询是否拼写正确,但它经常会建议替换以改进查询。 - Captain Giraffe
@Captain 这里的关键词是for sure。当然,在接受gmial.com地址和其他常见的拼写错误之前,没有什么不可以建议进行更正。感谢你的建议!+1 - Pekka
检查输入的主机名与常见主机名列表之间的Levenstein距离,如果距离为1,则询问用户确认。 - Tom Gullen

5
创建一个常见的电子邮件域名列表:
hotmail.com
gmail.com
googlemail.com
... etc

当用户输入电子邮件地址时,请获取所输入地址的域名,并计算其与您列表中的域名之间的Levenstein距离。如果距离为1(或可能为2),则要求用户确认这是他们想要的电子邮件地址。


先生,这是一个非常好的方法 - 谢谢! - Anatol Bivol

3

我认为很难为通用情况找到通用解决方案。

话虽如此,最常见的错误是交换两个相邻字母。 因此,您可能需要检查最大的网站Gmail、Yahoo等的字符内容;基于此,如果原始内容与Gmail等不匹配,则建议替代拼写。

  • 不要假设用户有错,如果看起来可疑,请建议替代方案。另一个回复中提到了白名单。
  • 如果您需要知道是否可以从此地址获得回复,请使用确认邮件。 您不能假设您找到的拼写有误,这就是确认邮件的作用。
  • 使其非常不显眼(Ajax跃入脑海)。

2
有趣的是,这个URL确实存在http://www.gmial.com。事实上,你很难知道它是一个错误还是一个“奇怪”的域名。看看Google API,因为当你在Google中输入错误的内容时,他们会建议你“你是不是想说...”祝你好运。
阿尔诺

2
在我们的表单中,我们使用了多种技术。虽然坏数据仍然可能会溜走,但机会大大降低了。
第一步是使用通常可用的简单格式化正则表达式 - 只需确保它符合 RFC 标准。如果失败了,最好在此时为用户提供确认表单,因为他们可能会在修复此问题时捕捉到其他错误。
接下来是检查域的 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支持的所有内容)。我的库是免费的,可以在这里找到:http://snapwebsites.org/project/libtld -- 此外,我认为禁止国际电子邮件地址是“危险”的,因为我可能有一个像alexis@alexiswilke.me这样的电子邮件地址,而.me不是美国域名(尽管在这里广泛使用,如.co、.fm、.ws等)。我的TLD表有7075个条目...那肯定也很复杂! - Alexis Wilke

1
Email Spell Checker是2013年alttag回答中提到的Mail Check JavaScript库的继任者。MailCheck现在已经被放弃,并且存在一些重大的错误:

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

我完全重写了它,并将其更新到2022年及以后,欢迎贡献者加入:https://github.com/ZooTools/email-spell-checker

甚至在README上链接的域名也已经过期

根据Email Spell Checker的开发者,与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

0

试图自动纠正错误数据是一种非常危险的做法。最终,只有用户能提供正确的数据。但是,有关电子邮件地址格式的严格规则存在 - 可以在javascript中运行regex检查(或使用具有相同regex语法的preg函数) - 但请注意,互联网上有很多错误的regex示例声称解决了这个问题。

这应该是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的最佳方法是向要提交的地址发送一个令牌,通过网络返回,但如果数据不来自控制邮箱的人,并且即使他们这样做,操作与主要交互分离,这对于验证没有太大帮助。另一个考虑因素是,今天有效的电子邮件地址可能明天就无效了。

使用正则表达式(和MX查找)仍然是提供即时反馈给用户的好方法,但对于完整的解决方案,您还需要监视退信


0

就像之前提到的那样,自动假设某人输错了电子邮件并不是一个好主意。更好的方法是实现一个小的JavaScript函数,检查电子邮件的域名是否可能输错,并警告用户,而不是从一开始就假定他们是错误的。

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

编辑:好的,也许不只是一分钟。看看 http://jsbin.com/iyaxuq/8/edit,亲自体验JavaScript如何帮助防止常见的打字错误。试试像:test@gmail.cmo,another@yhaoo.com,loser@htomali.ocm(hotmail的拼写错误)和me@aol.com这样的电子邮件。

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


0

你不能以自动更正拼错的电子邮件域名的方式提供此功能,因为你所认为无效的名称实际上可能是有效的。你应该预期任何东西都可以作为电子邮件地址域名输入。

我建议,如果你正在创建注册表格,那么你可以向用户提供一个下拉菜单,其中包含你所知道的所有可能的域名,这样他就可以从中选择。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接