【问题标题】:Better way to detect if email is from multiple domains检测电子邮件是否来自多个域的更好方法
【发布时间】:2021-07-15 15:03:44
【问题描述】:

我正在进行验证以检测电子邮件是否来自某个域。但是,我还希望将此域的沙箱环境列入白名单(沙箱只是附加了一个“.int”)。这是我目前拥有的

if ( !(email.endsWith("@mydomain.com") || email.endsWith("@mydomain.com.int") ) {
  throw new Error('invalid email');
}

基本上,只是寻找一种更好的方法来检查电子邮件是否以多个域结尾。我可以从@(包括)中删除所有内容,然后使用一些白名单数组进行检查。或者,我可以使用正则表达式。只是想知道别人怎么想。谢谢!

【问题讨论】:

标签: javascript regex string


【解决方案1】:

您可以提取@ 之后的所有内容并检查白名单。

const mydomains = new Set(['mydomain.com', 'mydomain.com.int']);
let emaildomain = email.split('@')[1].toLowerCase();
if (!mydomains.has(emaildomain)) {
    throw new Error('invalid email');
}

或正则表达式:

const mydomains_regex = /@(mydomain\.com|mydomain\.com\.int)$/i;
if (!mydomains_regex.test(email)) {
    throw new Error('invalid email');
}

【讨论】:

  • 对于 O(1) 测试,请考虑 const mydomains = { 'mydomain.com' : true, 'mydomain.com.int': true };
  • @danh 除非您有很多域,否则差异可以忽略不计。而不是一个对象,我会使用一个集合。
  • 我明白,@Barmar,虽然白名单通常很大。为了保护对象,它有助于将大型白名单保存在键值存储中。
  • @Barmar 您使用 Set 的任何具体原因?除了假设白名单将始终包含唯一值吗?
  • 因为集合查找是 O(1) 而不是 O(n)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多