用于规范化(规范化但不仅仅是清理)电子邮件地址的库

时间:2011-06-30 23:02:14

标签: java email normalization email-validation

有多种方法可以生成电子邮件地址字符串,这些字符串与直接字符串比较(见下文)不同,但在逻辑上是等效的(即发送到两者的邮件都转到同一邮箱)。 这通常允许用户提供看似独特的电子邮件地址,即使不允许严格的平等。

我希望找到一个试图进行规范化的库,以便从大量的电子邮件地址中找到一些重复项。这里的目标是找到尽可能多的重复项。 鉴于这对多种用途有多大帮助(在我的情况下,它是简单的滥用检测,因为滥用帐户倾向于(尝试)只重用某些帐户),我认为可能存在现有的解决方案。

那么什么样的事情会有所不同?我至少知道这样的事情:

  • 域名部分不区分大小写(根据DNS);但本地部分可能是也可能不是,这取决于邮件提供商(例如,Gmail认为它不区分大小写)
  • 许多域名都有别名(googlemail.com相当于gmail.com)
  • 某些电子邮件提供商允许他们忽略的其他变体(例如,gmail会忽略电子邮件地址中的任何点!)

理想情况下,这将使用Java,尽管脚本语言也可以使用(命令行工具)

2 个答案:

答案 0 :(得分:17)

我可以通过搜索“normalize email address”在 Google 上找到一些代码,但是没有什么比这更彻底了。我担心你必须编写自己的工具。如果我要编写这样的工具,我认为我会应用以下几条规则:

首先,该工具将降低域名的大小写(在@之后)。它应该不会太难,除非你想处理国际域名的电子邮件。例如,JoE@caFÉ.fR(注意E上的重音)应首先通过Nameprep算法。这导致JoE@xn--caf-dma.fr。我从未见过有这样一个国际电子邮件地址的人,但我怀疑你可能会在中国或日本找到一些,例如。

RFC 5322声明电子邮件的本地部分(在@之前)区分大小写,但几乎所有提供商的事实上的标准都是忽略大小写(我从未见过人类实际使用的区分大小写的电子邮件地址,但我认为仍然有一些系统管理员使用他们的Un * x电子邮件帐户,这种情况很重要)。我认为该工具应该有一个选项来忽略案例以获取域名列表(或者相反,只对区域列表区分大小写)。所以此时,电子邮件地址JoE@caFÉ.fR现已标准化为joe@xn--caf-dma.fr。

再一次,弹出国际(又称非ASCII)电子邮件地址的问题。 如果本地部分是非ASCII的怎么办?例如甲斐@黒川。日本(免责声明:我不会说日语)。 RFC 5322禁止这样做,但最近的RFC确实支持这一点(参见this wikipedia article)。很多语言都没有低级或大写的概念。当他们这样做时,如果你想改成小写形式,确保使用适当的Unicode小写算法,它并不总是微不足道的。例如,在德语中,“Großes”一词的小写字母可能是“grosses”或“großes”(免责声明:我也不会说德语)。所以在这一点上,电子邮件地址“Großes@caFÉ.Fr”应该已经标准化为“grosses@xn--caf-dma.fr”。

我没有详细阅读RFC 5322,但我认为还有可能在电子邮件地址中有评论,无论是在本地部分的开头还是结尾,例如(先生)john.lennon@beatles.com或john.lennon(ono)@beatles.com。应该删除这些注释(这将导致john.lennon@beatles.com。剥离注释并不是完全无足轻重的,因为我不知道如何处理嵌套注释,并且用双引号括起来的注释应该被剥离。例如,根据RFC:“john。(ono).lennon”@不应该删除以下电子邮件地址中的注释。 beatles.com。

一旦电子邮件正常化,我会应用您建议的“提供商特定”规则。例如,剥离GMail地址中的点并混合等效的域名(例如googlemail.com == gmail.com)。我想我会把它与以前的规范化步骤分开。

请注意,Gmail也会忽略加号(+)及其后的所有内容,例如s.m.i.t.h+hello_world@gmail.com等同于smith@gmail.com。

我不知道其他提供商规则。问题是,这些规则可能随时发生变化,您必须全部跟踪它们。

我认为就是这样。如果你想出一些工作代码,我真的很想看到它。

干杯!

答案 1 :(得分:4)

我一直在使用Apache James Mime4J来解析电子邮件地址。

  1. 正确处理(评论)并将其从localPart和domainPart中删除

  2. 它正确处理“间隔和引用”和+标记的localParts。

  3. 它有getLocalPart()和getDomainPart()方法。

  4. 虽然没有规范化gmail localParts。