【问题标题】:Check if an email address is not a "free webmail" (hotmail, yahoo...)检查电子邮件地址是否不是“免费网络邮件”(hotmail、yahoo...)
【发布时间】:2011-11-25 16:03:43
【问题描述】:

编辑:我的网站仅向 Gmail 和 Google Apps 用户提供服务,并且确实希望确保其他免费电子邮件用户在启动 oauth 配对时不会收到错误消息。

这就是交易:要么我尝试找出这是一个 Gmail/Google Apps 地址,要么尝试阻止流行的免费邮件用户尝试订阅。

我想阻止属于 Gmail、Hotmail、Yahoo 等的所有“免费”电子邮件地址订阅我的网站。

我怎样才能在 javascript 中正确地做到这一点? 这是我开发的第一个脚本:

var domain_matche = /@(.*)$/.exec(email);
var domain_name = domain_matche[1].substring(0, domain_matche[1].indexOf(".", 0))
if (domain_name == "hotmail" || domain_name == "yahoo" ) {
      alert("not a valid email");     
} 

但它不会检测像 test@hotmail.co.il 或 test@subdomain.hotmail.com 这样的电子邮件。

你能帮忙吗?非常感谢!

【问题讨论】:

  • 然后我来了,在我的浏览器中停用 JavaScript 并注册我的 GMail 帐户。你的举动。 :)
  • 天哪。好吧,你可以在你的名单上.indexOf()hotmailyahoo@ 之前是否存在真的重要吗?
  • 是的@TillHelgeHelwig 是对的,javascript 验证是一种让用户快速响应其表单提交的好方法,但它应该由服务器端验证来支持
  • @TillHelgeHelwig 已经在服务器端进行了一些万无一失的检查...:)
  • 对于只有这些免费电子邮件地址之一的穷用户?疏远用户的好方法!

标签: javascript


【解决方案1】:

首先,我建议不要这样做。因为雅虎确实提供付费付费服务(我自己也在使用,如果你不允许我注册,我会很生气)。

您还需要在客户端 (JS) 和服务器上实现(PHP、ASP.net 或您正在使用的任何东西),因为我可以轻松禁用 Javascript,而您的检查不会然后执行。

但是,如果您知道自己在做什么并希望它正确完成,请先查找“@”,然后查找以下“。”并获取它们之间的字符串。

代码:

// get index of '@'
var index_at = email.indexOf('@');

// get index of the '.' following the '@' and use it to get the real domain name
var domain = email.substring(index_at + 1,  email.indexOf('.', idx));

// now use the domain to filter the mail providers you do not like

检查所有子域的代码(对于 abc@subdomain.hotmail.com):

// get the string after '@'
var after_at = email.substring(email.indexOf('@') + 1);

// get all parts split on '.', so for abc@x.y.z you can check both x and y
var dot_split = after_at.split('.');
for(var i = 0; i < dot_split.length; i++)
    // check each dot_split[i] here for forbidden domains

【讨论】:

  • 子域如何工作... test@subdomain.hotmail.com?
  • Bryan:然后先看一下'@',然后比较每个字符串之间的任何'.'对于'hotmail','yahoo'等,之后:)
  • @erizias 听起来像是一种有效的方法,尽管您的代码没有反映这种方法(您实际上是在做与 OP 相同的事情)。
  • @Bryan 我已经更新了我的代码,它现在可以按预期工作,原始代码也适用于test@hotmail.co.il,但不适用于子域案例
  • 我想我混淆了这个线程上的谁是谁,但无论如何,现在看起来不错:)
【解决方案2】:

Till Helge Helwig 的意思是,您只是无法在 JavaScript 中完成,或者对此进行任何客户端验证,您需要在服务器上进行验证。

这个正则表达式应该与 hotmail 和 yahoo 匹配:[a-zA-Z_-.]+@((hotmail)|(yahoo))\.[a-z]{2,4}(我只是匆匆写下这个正则表达式,所以请彻底测试一下)

【讨论】:

    【解决方案3】:
        function submitForm() 
           {
        var email = form.email.value;
        var emailRegex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/;
        var freeRegex = /^[\w-\.]+@([hotmail+\.]|[yahoo+\.]|[gmail+\.])+[\w-]{2,4}$/;
    
         if(!email.match(emailRegex)) 
            {
               alert("Please enter a valid email address")
               return false;
            }
    
         if(email.match(freeRegex))
            {   
               alert("You cannot use free email address!")
               return false;
              }
          return true; 
         }
    

    【讨论】:

    • freeRegex 不正确,[] 括号表示字符集,因此 [yahoo] 应该匹配 "hooya" 和 "yhaoo" 以及字符之间的任何排列
    【解决方案4】:

    我自己一直在为希望将 hotmail、yahoo、gmail 和其他用户过滤到他网站上的不同登录页面的客户构建类似的东西。我不问为什么,我就是问!

    在这种情况下,我们告诉用户我们希望使用非免费地址来快速跟踪他们的回调,并为他们提供一个选项来放入不同的选项。

    这是我处理表单的 jQuery 版本,使用来自上述帖子的信息,尤其是来自 @Simeon 的正则表达式

    $("form").submit(function(){
    
        // Get the email value from the input with an id="email"
        var email_addr = $('#email').val();
    
        // The regex to check it against
        var re = '[a-zA-Z_\\.-]+@((hotmail)|(yahoo)|(gmail))\\.[a-z]{2,4}';
    
        // Check if the email matches
        if(email_addr.match(re)){
            // Email is on the filter list
            // Return false and don't submit the form, or do whatever
            return false;
        } else {
            // Email ok
            // Allow the form to be submitted
            return true;
        }
    });
    

    所以,我知道你可以关闭 javascript 并摆脱它,这在我们的案例中并不重要,因为我们检查服务器端并在那里做一些事情,但这是一种方法,所以用户无需等待页面刷新即可收到有关我们正在做什么的消息。

    希望对大家有所帮助!

    【讨论】:

    • 嗨@Ben 我正在使用这个验证,但是当我们输入 test123@gmail.com 时,它没有检查。请检查并更新。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 2016-08-20
    • 2012-09-09
    • 2011-06-08
    • 2011-08-17
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多