通过在Google上搜索"归一化邮箱地址",我能找到一些代码片段,但没有足够全面的。恐怕您需要编写自己的工具。如果我要编写这样的工具,我认为我会应用以下几条规则:
首先,该工具将将域名(@后面)转换为小写字母。除非您想处理带有国际域名的电子邮件,否则这不应该太难。例如,JoE@caFÉ.fR(请注意E上的重音符号),应首先经过Nameprep算法。这将导致JoE@xn--caf-dma.fr。我从未见过带有这种国际电子邮件地址的人,但我猜您可能会在中国或日本找到一些。
RFC 5322规定电子邮件的本地部分(@之前)区分大小写,但实际上几乎所有提供商的非正式标准是忽略大小写(我从未见过人类使用区分大小写的电子邮件地址,但我想仍有一些系统管理员在使用Unix电子邮件帐户,其中大小写确实很重要)。我认为该工具应该有一个忽略大小写的选项,适用于一组域名(或相反,只针对一组域名区分大小写)。因此,现在电子邮件地址JoE@caFÉ.fR已经被规范化为joe@xn--caf-dma.fr。
再次提出国际(也称非ASCII)电子邮件地址的问题。如果本地部分是非ASCII字符怎么办?例如像甲斐@黒川.日本这样的东西(免责声明:我不会说日语)。RFC 5322禁止这样做,但更近期的RFC支持这样做(请参见
此维基百科文章)。很多语言没有大小写的概念。当它们有时,如果您想要改为小写形式,请确保使用适当的Unicode小写算法,这并不总是简单的。例如,在德语中,单词“Großes”的小写可能是“grosses”或“großes”(免责声明:我也不会说德语)。因此,此时电子邮件地址“Großes@caFÉ.Fr”应已归一化为“grosses@xn--caf-dma.fr”。
我没有详细阅读RFC 5322,但我认为电子邮件地址中也可能有
注释,可以在本地部分的开头或结尾添加,例如(sir)john.lennon@beatles.com 或 john.lennon(ono)@beatles.com。这些注释应该被剥离(这将导致john.lennon@beatles.com)。剥离注释并不完全简单,因为我不知道该如何处理嵌套的注释,而且根据RFC(除非我弄错了),用双引号括起来的注释不应该被剥离。例如,以下电子邮件地址中的注释不应根据RFC被剥离:"john.(ono).lennon"@beatles.com。
一旦电子邮件被规范化,我会应用您建议的“特定于提供程序”的规则。例如,在GMail地址中去掉点并混合等效的域名(例如googlemail.com == gmail.com)。我认为我会将其与先前的规范化步骤保持真正分离。
请注意,Gmail还忽略加号(+)和之后的所有内容,例如s.m.i.t.h+hello_world@gmail.com等同于smith@gmail.com。
我不了解其他供应商的规则。问题是,这些规则可能随时发生变化,你需要跟踪所有这些规则。
我想这就是全部了。如果您有一些可用的代码,我会非常感兴趣看到它。
干杯!