在JavaScript中可以验证电子邮件地址吗?
我经常收到的代码片段请求之一是关于能够验证电子邮件地址的函数。虽然听起来很简单,但我一直推迟写这个主题的原因是,对于这种问题没有很好的解决方案。
从理论上讲,可以使用正则表达式验证电子邮件地址。毕竟,有一些简单的规则,比如存在at(@
)符号和适当的域名,对吗?是的,但是有很多有效的电子邮件地址看起来并不完全像那样。实际上,有一个完整的标准,RFC 2822,定义了电子邮件地址的样式。然后,还有不同邮件服务器允许的问题。例如,Gmail不允许下划线(_
)或连续多个句点(.
)。
此外,即使您可以验证电子邮件地址,也无法知道该地址是否实际在使用中。唯一的方法是发送一封电子邮件并检查响应。这就是为什么大多数网站和应用程序现在首先会发送给您一封确认电子邮件的原因。
最后,即使您使用符合RFC 2822的正则表达式,也不是没有问题的。理解它的工作原理或弄清楚它是否对每种情况都有效将会非常困难。更重要的是,如果实现不正确,它可能容易受到正则表达式拒绝服务(ReDoS)攻击。
到现在为止,您应该开始明白为什么我一直不愿展示解决电子邮件验证问题的解决方案。虽然解决方案确实存在,但必须仔细考虑每个解决方案的影响。
我的建议是在前端检查基本结构元素,然后从服务器发送确认电子邮件以检查电子邮件地址是否在使用中。这种方法易于实现并能够完成工作。回到最初的想法,这是一个检查最常见语法错误的简单函数。
const isEmailValid = address => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(address);
isEmailValid('abcd@site.com'); // true
isEmailValid('ab_c@site.com'); // true
isEmailValid('ab.c@site.com'); // true
isEmailValid('a@my.site.com'); // true
isEmailValid('ab c@site.com'); // false
isEmailValid('ab@c@site.com'); // false
isEmailValid('abcde@sitecom'); // false
isEmailValid('abcdesite.com'); // false
这个正则表达式非常简短,但它验证了以下条件:
- 邮箱地址中不能有任何空白字符
- 域名部分之前必须有一个
@
字符 - 域名部分中至少有一个
.
字符