【问题标题】:In asp.net is there a function to validate an email address?在 asp.net 中是否有验证电子邮件地址的功能?
【发布时间】:2010-12-21 04:40:19
【问题描述】:

我注意到,如果您尝试向无效地址发送电子邮件,则会引发异常:

MailAddress To=new MailAddress("invalidemailaddress","recipientname");

抛出:

 "The specified string is not in the form required for an e-mail address"

这意味着必须在 MailAddress 中执行一个 .Net 函数来检查电子邮件地址是否有效。有没有办法直接调用这个“验证”函数?这样我就不需要创建自己的 IsValid 函数了。

【问题讨论】:

    标签: asp.net email


    【解决方案1】:

    不,但你可以做一个:

    public bool ValidateEmailAddress (string email)
    {
       if (string.IsNullOrEmpty (email)) return false;
    
        try
        {
            MailAddress to = new MailAddress (email);
    
            return true;
        }
        catch (WhateverException e)
        {
            return false;
        }
    }
    

    回答cmets。我知道这种技术被认为是一种不好的技术,这是有道理的。我想指出的是,这种方法可以 100% 保证 .NET 邮件库最近能够发送到经过验证的地址。正则表达式(其中有很多)的问题在于,每个正则表达式都根据规范处理一组技术上正确的地址的一个特定子集。一个会更窄,另一个会比 .NET 内部定义的子集更宽。如果您要使用正则表达式验证,那么在第一种情况下,您的正则表达式会切断一部分有效地址(如 .NET 所示),在后一种情况下,验证将允许 .NET 邮件库不会通过的地址。 t 根据其自身的内部验证将其视为无效。确保您的有效集合 100% 与 .NET 集合(或您将使用的任何其他第三方库)匹配的一种真正方法是采用 try/catch 方法,除非该第三方库当然提供了一些验证方法已经。

    【讨论】:

    • 哎哟。作为流控制的异常处理:(
    • 其中一件你不应该做的事情,但它在实践中不会造成任何问题。
    • 迄今为止最可接受的答案。在这种情况下,为了处理的精确性,可以忽略不好的编码实践。直到.Net 开放了一种面向公众的方法来根据他们的规则进行验证,我才会使用这种方法,即使只是为了方便。我书中的有效妥协
    【解决方案2】:

    很遗憾,遗憾的是,如果不对其进行逆向工程或使用特定的异常,就无法获得该功能。

    验证电子邮件地址的传统方法一直是使用正则表达式,但如果您愿意,还可以进一步验证电子邮件:

    The Forgotten Art of Email Address Validation

    【讨论】:

      【解决方案3】:

      有一个很好的电子邮件验证示例function on CodeProject

      Vasudevan Deepak Kumar写的原始源码:

      public static bool isEmail(string inputEmail)
      {
         inputEmail  = NulltoString(inputEmail);
         string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
               @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + 
               @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
      
         Regex re = new Regex(strRegex);
      
         if (re.IsMatch(inputEmail))
          return (true);
         else
          return (false);
      }
      

      【讨论】:

      • 不幸的是,这些正则表达式验证在某些情况下毫无意义。如果您打算使用 .NET 邮件库发送邮件,您希望确保您的验证与库中的验证完全一样。否则,您的验证会切断一段格式正确的地址,或者它会让 .NET 邮件程序无法处理的地址通过。只是为了记住它。
      【解决方案4】:

      你可以编写自己的类:

      class EmailAddress
      {
        private MailAddress _email;
      
        public string Address
        {
          get
          {
            return _email == null ? string.Empty : _email.Address;
          }
        }
      
        public string DisplayName
        {
          get
          {
            return _email == null ? string.Empty : _email.DisplayName;
          }
        }
      
        public string Host
        {
          get
          {
            return _email == null ? string.Empty : _email.Host;
          }
        }
      
        public string User
        {
          get
          {
            return _email == null ? string.Empty : _email.User;
          }
        }
      
        public EmailAddress(string email)
        {
          try {
            _email = new MailAddress(email);
          }
          catch (Exception) {
            _email = null;
          }
        }
      
        public EmailAddress(string email, string displayName)
        {
          try {
            _email = new MailAddress(email, displayName);
          }
          catch (Exception) {
            _email = null;
          }
        }
      
        public EmailAddress(string email, string displayName, Encoding displayNameEncoding)
        {
          try {
            _email = new MailAddress(email, displayName, displayNameEncoding);
          }
          catch (Exception) {
            _email = null;
          }
        }
      
        public bool IsValid()
        {
          return _email == null ? false : true;
        }
      
        public override string ToString()
        {
          return this.Address;
        }
      }
      

      现在您可以像MailAddress 一样使用它,但现在电子邮件地址无效时也不例外。相反,您调用 IsValid 方法:

      var email = new EmailAddress("user@host.com");
      if (email.IsValid()) {
        ...
      }
      else {
        ...
      }
      

      【讨论】:

        【解决方案5】:

        是的,有这样一个 .Net 函数,但它的功能无法通过“标准”方式访问:MailAdress 使用私有的ParseAddress 方法,而后者又使用System.Net.Mime.MailBnfHelper。后者是一个internal 类,所以它不能(容易)在框架本身之外访问。

        因此,使用这些函数的唯一方法是使用反射,我强烈建议不要这样做。由于这些函数未记录且未经反射就无法访问,因此它们的实现可能会发生变化,并且您的代码可能会在框架的未来版本中中断。

        【讨论】:

          猜你喜欢
          • 2011-04-22
          • 2010-09-16
          • 2021-07-03
          • 2012-10-30
          • 2012-03-07
          • 2011-03-04
          • 2015-10-21
          • 1970-01-01
          相关资源
          最近更新 更多