有没有人有我可以用来测试我的 JS 地址验证脚本的电子邮件地址列表?我正在寻找尽可能完整的列表来测试最常见的边缘情况,如果不是所有情况的话。
3 回答
根据 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
我现在整理了来自 Cal Henderson、Dave Child、Phil Haack、Doug Lovell 和 RFC 3696的测试用例。总共164 个测试地址。
我针对我能找到的所有验证器运行了所有这些测试。比较在这里: http: //www.dominicsayers.com/isemail
随着人们增强他们的验证器,我将尝试使此页面保持最新。感谢 Cal、Dave 和 Phil 在编译这些测试时提供的帮助和合作,以及对我自己的验证器的建设性批评。
人们应该特别注意针对 RFC 3696 的勘误表。其中三个规范示例实际上是无效地址。地址的最大长度是 254 或 256 个字符,而不是320。
域部分(在最后一个 @ 之后)是一系列以点分隔的字符串标签。
每个标签都是由 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;
}