如何验证电子邮件地址与网站域匹配?

Posted

技术标签:

【中文标题】如何验证电子邮件地址与网站域匹配?【英文标题】:How to validate email address match with website domain? 【发布时间】:2017-03-02 22:27:02 【问题描述】:

我的表单上有 2 个输入字段:电子邮件和网站

如何使用 JQuery 验证电子邮件地址域必须与网站域匹配?

例如:如果网站是 http://example.com 或带有 www 或不带 http:// 或不带 http://www。 那么电子邮件地址字段必须是 user@example.com

这是我的表格https://jsfiddle.net/zm7e8r7p/

$(document).ready(function()
$( "#target" ).submit(function( event ) 

var val = $("#website").val();
var myString = val.substr(val.indexOf("http://") + 7);

var emailString = $("#email").val();
var myEmail = emailString.substr(emailString.indexOf("@")+1);

if (myString == myEmail)
$( "span" ).text( "Validated..." ).show();
event.preventDefault();
else
$( "span" ).text( "Not valid!" ).show();
event.preventDefault();



);
);

【问题讨论】:

在比较之前尝试从 URL 中删除协议和 www,例如.replace(/https?:\/\/(?:www\.)?/, ""); 你可以在这个问题***.com/questions/13908877/…找到正确答案 @YolloPain:这个问题没有答案。 阅读第二个答案 如果url是http://mysubdomain1.mysubdomain2.mydomain.name ? 【参考方案1】:

您可以通过 Crockford 使用 URL 正则表达式

仅获取域名的最后两部分是可选的,如果您想将ww2.mobile.gmail.com 转换为gmail.com,可以使用它。正如@samanime 指出的那样,这种逻辑会影响.co.in 这样的域名

var parse_url = /^(?:([A-Za-z]+):)?(\/0,3)([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url = 'www.mobile.ora.co.in:80/goodparts?q#fragment';

var result = parse_url.exec(url);

var hostName = result[3];

console.log("host name: ", hostName);

lastTwo = hostName.split('.');
lastTwo = lastTwo.length>2?lastTwo.slice(Math.max(lastTwo.length - 2, 1)) : lastTwo;
onlyMainDomain = lastTwo.join('.');

console.log('only main domain:', onlyMainDomain);

var email = "someone@ora.co.in";

var emailDomain = email.split('@')[1];

console.log('email domain:', emailDomain);

console.log("valid?" , emailDomain === onlyMainDomain);

//check if email domain is a child of hostName

emailDomainRev = emailDomain.split('.').reverse();
hostNameRev = hostName.split('.').reverse();
var emailDomainIsChildOfHostName = true;

if(emailDomainRev.length > hostNameRev.length)
  emailDomainIsChildOfHostName = false;
  
else
  emailDomainIsChildOfHostName = emailDomainRev.reduce(function(acc, item, index)
     return acc && (item === hostNameRev[index]);
  ,true);
  
console.log("email domain is a child of host name:", emailDomainIsChildOfHostName);

【讨论】:

您假设只有电子邮件的最后两位有效。这不适用于example.co.jp 之类的东西,从技术上讲,您还可以从子域中获取电子邮件,例如me@sub.example.com 是的,没错。我想知道OP的所有要求是什么!无论如何,他可以从那里获得完整的域名,他可以使用. 拆分并按照他的意愿进行处理。 谢谢,在所有解决方案中,这个是最好的,目前为止最适合我的情况。 @delphiman 我添加了一个解决方案来检查电子邮件域是否是主机名的子域,它也涵盖了诸如带有.co.in 的域之类的情况。如果主机名是 www.mobile.gmail.com 并且电子邮件是 x@gmail.comx@mobile.gmail.com,它也会验证为 true【参考方案2】:

这是一个简单的 JavaScript 流程,用于使用您的域名验证电子邮件。

function ValidateEmail(email) 
  var re = /\S+@\S+\.\S+/; /*Regular expression for valid email*/
  return re.test(email);   /*Return `true` if valid, Otherwise return `false`*/


var domain = 'www.example@example.com';
var email  ='emaxple@example.com';

if(ValidateEmail(email))
  email  = email.split('@');                     /* Split email after `@` Sign*/
  email  = email[1]                              /*After split, `email[0]=emaxple, email[1]=emaxple.com`*/
  domain = domain.split('').reverse().join('');  /*Now `domain = moc.elpmaxe@elpmaxe.www`*/
  email  = email.split('').reverse().join('');   /*Now `email = moc.elpmaxe*/
  email  = email + '@';                          /*Now `email = moc.elpmaxe@`*/
  if(domain.indexOf(email)==0)                  /*If only return `0` then valid, Otherwise Invalid*/
    /*Valid with your domain*/
  else
    /*Doesn't match with your domain*/
  
else
    /*Invalid Email*/

【讨论】:

"moc.elpmaxe@elpmaxe.www".indexOf('moc.el') === 0 ,您必须在. 拆分并比较每个。 现在我用email = email + '@'; 更新了我的代码,所以,现在不再有重复的组合。谢谢@sabithpocker【参考方案3】:

我添加了 Wiktor 建议的正则表达式,并稍作更改以接受没有协议的 url。

您的代码如下所示:

$(document).ready(function()
    $("#target").submit(function(event) 
        var website = $("#website").val();
        var websiteDomain = website.replace(/^(https?:\/\/)?(?:www\.)?/, "");

        var email = $("#email").val();
        var emailDomain = email.substr(email.indexOf("@")+1);

        $("span").text(websiteDomain === emailDomain ? "Valid!" : "Not valid!" ).show()

        event.preventDefault();
    );
);

【讨论】:

【参考方案4】:

您的问题有一个棘手的部分。从技术上讲,您可以拥有一个包含任意数量部分的域。例如:this.is.a.valid.domain.com

使用新的自定义***域,它会变得更加棘手,因为它们可以拥有各种疯狂的组合和长度。例如:this.is.also.a.valid.name.on.the.top.level.cake

看起来一点也不像域,但如果您拥有***域 cake,您可以实现它。

因此,您不能真正修剪子域并确保www.example.com 生成电子邮件@example.com。但是,您可以判断它是否至少在 @www.example.com@example.com@com 上,它们都可能有效。 (实际上,您不能在任何受控的***域上拥有一个,但在极少数情况下允许它可能是件好事。)

这就是为什么大多数网站要求您单击发送给您的电子邮件中的链接以验证您的 URL。

使用我刚刚描述的上述标准,您可以这样做:

var website = "http://www.example.com"; // website from form
var email = "me@example.com"; // email from form
var emailDomain = email.split('@')[1];
var websiteDomain = website.match(/^(?:https?:\/\/)?([^\/]+)/)[1];
var isValidEmail = (websiteDomain || '').lastIndexOf(emailDomain) === (websiteDomain || '').length - (emailDomain || '').length;

isValidEmail 将包含 true 如果它是一个有效的匹配,或者 false 如果它不是。

我已经添加了检查是否出现上述问题,因此如果上述部分之一出现问题,它不会引发错误。如果您提供的网站无效,websiteDomain 将是 undefined。同样,对于完全无效的电子邮件,emailDomain 将是`未定义的。

【讨论】:

【参考方案5】:

我更新了你的代码。我给你这里的链接 https://jsfiddle.net/zm7e8r7p/5/

$(document).ready(function()
      $( "#target" ).submit(function(event) 
      event.preventDefault();
      var emailString = $("#email").val();
      //cut rule by @
      var afterAt = emailString.split('@');

      var val = $("#website").val();
      var myString = val.substr(-(afterAt[1].length));

      console.log(afterAt[1].length);

      if (myString == afterAt[1])
       console.log('works');return

      else
        console.log('not');return
      ;
    );
);

【讨论】:

如果我输入这样的域 example.com/test/test/html 并且电子邮件是这样的 user@example.com 将无法正常工作

以上是关于如何验证电子邮件地址与网站域匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如果用户名/电子邮件与特定域不匹配,则显示窗口警报

如何在 AWS SES 中验证电子邮件地址

如何在表单中验证电子邮件地址的域?

用户验证下降百分比

如何使用AWS创建基于域的电子邮件地址

***域的电子邮件地址验证