【发布时间】:2013-08-12 10:54:55
【问题描述】:
我正在尝试验证电子邮件地址,但是我想要尽可能宽松的验证,因为我打算通过向用户发送验证电子邮件来支持这一点(我知道这被问了很多,但其他问题集中在尽可能严格,而我试图确定可能的最宽松的检查)。
我仍然认为进行某种程度的验证以删除不可能是电子邮件地址的内容很重要...我不希望 "this is not @n email. fool" 沾沾自喜地坐在我的数据库中假装是电子邮件。虽然我很高兴有"this.is.not.an.email@fool.com"。
到目前为止,这是我的功能:
function validate(email) {
var atIndex = email.lastIndexOf('@');
// Make sure email contains an '@' character and that it is neither the first or last character
if (atIndex > 0 && atIndex < email.length -1) {
// Everything before the last '@' character
var local = email.substring(0, atIndex);
// Everything after the last '@' character
var domain = email.substring(atIndex + 1, email.length);
var dotIndex = domain.lastIndexOf('.');
// Make sure domain contains a '.' character and that it is neither the first or last character
if (dotIndex > 0 && dotIndex < domain.length - 1) {
// Array of strings that aren't allowed to appear in a domain
var domainRestrictions = [
"..",
" "
];
var i = domainRestrictions.length;
while (i-- > -1) {
if (domain.indexOf(domainRestrictions[i]) > -1) {
return false;
}
}
// Array of strings that the local portion can neither start or end with
var localRestrictions = [
".",
" "
];
i = localRestrictions.length;
while (i-- > -1) {
var string = localRestrictions[i];
if (local.indexOf(string) == 0 || local.lastIndexOf(string) == local.length - 1) {
return false;
}
}
return true;
}
}
return false;
}
目前我不允许以下行为:
- 任何不带“@”符号的内容。
- 任何不包含“.”的域或包含它作为第一个或最后一个字符。
- 任何包含空格或“..”的域 任何以“.”开头或结尾的本地部分或空格
其他所有内容都被视为有效并继续传递。
我的问题是,是否有任何有效的电子邮件地址会阻塞?有没有更安全的假设我可以做出一个电子邮件地址不能包含的假设?
【问题讨论】:
-
RFC 中没有要求域包含“.”。
-
这不是问题的答案,但我个人认为“这不是@n 电子邮件,愚蠢的”和“not.a.real@email-address”之间没有区别。哈哈”。如果有人不想提供真实的电子邮件地址,他们只会编造一个。电子邮件验证的唯一好处是它可能会捕捉到用户可能犯的不需要的拼写错误。
-
@AdrianWragg 如何向这样的域发送电子邮件?我假设这只能发生在
localhost? -
@NabilKadimi 过于严格,作者本人承认它会阻塞某些有效的电子邮件地址。如果它可以存在,我会让他们使用它。
标签: javascript regex email-validation