20

有没有人有我可以用来测试我的 JS 地址验证脚本的电子邮件地址列表?我正在寻找尽可能完整的列表来测试最常见的边缘情况,如果不是所有情况的话。

4

3 回答 3

29

根据 RFC2822 有效的示例

  • 我@example.com
  • a.nonymous@example.com
  • 姓名+标签@example.com
  • name\@tag@example.com – 这是一个包含两个 @ 符号的有效电子邮件地址。
  • 空格\ are\ allowed@example.com
  • “可以引用空格”@example.com
  • !#$%&'*+-/=.?^_`{|}~@[1.0.0.127]
  • !#$%&'*+-/=.?^_`{|}~@[IPv6:0123:4567:89AB:CDEF:0123:4567:89AB:CDEF]
  • 我(这是评论)@example.com – 不鼓励评论,但 RFC2822 不禁止评论。

根据 RFC2822s 示例无效

  • 我@
  • @example.com
  • 我.@example.com
  • .me@example.com
  • 我@example..com
  • 我.example@com
  • 我\@example.com

来自: http ://en.wikibooks.org/wiki/JavaScript/Best_Practices

于 2008-11-18T00:46:16.250 回答
10

我现在整理了来自 Cal Henderson、Dave Child、Phil Haack、Doug Lovell 和 RFC 3696的测试用例。总共164 个测试地址

我针对我能找到的所有验证器运行了所有这些测试。比较在这里: http: //www.dominicsayers.com/isemail

随着人们增强他们的验证器,我将尝试使此页面保持最新。感谢 Cal、Dave 和 Phil 在编译这些测试时提供的帮助和合作,以及对我自己的验证器的建设性批评。

人们应该特别注意针对 RFC 3696 的勘误表。其中三个规范示例实际上是无效地址。地址的最大长度是 254 或 256 个字符,而不是320。

于 2009-02-22T16:26:45.533 回答
0

域部分(在最后一个 @ 之后)是一系列以点分隔的字符串标签。

每个标签都是由 AZ、az 0-9 或连字符 (-) 组成的 1 到 63 个八位字节的字符串

域的最大大小为 255 个八位字节。

为了与 arpanet 兼容,每个标签必须以字母开头并以字母或数字结尾,但某些 TLD:s 现在允许使用全数字域,例如 0.nu

请注意,TLD 允许为 63 个八位字节。很多脚本错误地将其限制为 2-3 个八位字节,从而使 domain.name 无效。

例子?

abcdefghijklmnopqrstuvwxyz.ABCDEFGHIJKLMNOPQRSTUVWXYZ.!#$%&'+-/=.?^`{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-0123456789.abcdefghijklmnopqrstu.vwxyzABCDEFGHIJKLMNOP.QRSTUVWXYZ0.1.2.3.4.5.6.7.8.9.az.AZ.0-9 .a0.b1.c2.d3.e4.f5.g6.h7.i8.j9.K0.L1.M2.N3.O.domain.name

(不,它没有注册)

更新:使用 IDNA 几乎一切皆有可能:

  • punnycode@XN--0ZWM56D.XN--HGBK6AJ7F53BBA
  • idna_in_clear(?)_text@例子.测试.مثال.آزمایشی

也可以看看:

https://stackoverflow.com/questions/3232/how-far-should-one-take-e-mail-address-validation

http://www.leshazlewood.com/?p=5

更新: Bobince 建议测试域名中的点。

摘要:仅测试@和域部分中的点,然后发送确认电子邮件。

这是一个测试@和点的例子:

  • 必须至少有一个@
  • 本地部分必须至少有一个字符( pos > 0)
  • 域部分必须至少有一个点
  • 域部分必须至少为 4 个字符

这是一个简单的:

function isEmail(address) {
    var pos = address.lastIndexOf("@");
    return pos > 0 && (address.lastIndexOf(".") > pos) && (address.length - pos > 4);
}

或返回对象中的本地和域部分的函数(如果您想进一步处理它,例如将其转换为 punycode)

function isEmail(address) {
    var pos = address.lastIndexOf("@");
    return pos > 0 && (address.lastIndexOf(".") > pos) && (address.length - pos > 4) ? 
    {
        local:address.substr(0,pos < 0 ? 0 : pos),
        domain:address.substr(pos+1)
    }: false;
}
于 2008-11-18T02:42:34.080 回答