2

我已经阅读了关于使用 MailAddress 验证电子邮件的内容,并生成了以下代码:

    try
                    {
                        var address = new MailAddress(value.Email);
                    }
                    catch (FormatException)
                    {
                        emailError = "Invalid Email";

 }

令我惊讶的是,该字符串被ndskfndlfk@sdflsdf验证为良好的电子邮件。知道为什么会这样吗?

4

2 回答 2

1

这可能不是有效的 WWW 域名,但在专用网络上,我认为它是有效的域名。如果您想获得更多选择性,那么正则表达式。

我尝试使用正则表达式解析合法电子邮件(消除垃圾邮件使用的虚假邮件),但它很混乱。

如果您可以访问实际的电子邮件标题,那么它并没有真正变得更容易,但它会变得更准确。

于 2012-09-21T22:50:52.657 回答
1

如果您确实需要过滤这些电子邮件地址,您可以使用此处找到的小实用程序,它使用正则表达式来验证电子邮件地址。请注意,这是 .Net 4.0 版本 - 与 4.5 略有不同。

using System;
using System.Globalization;
using System.Text.RegularExpressions;

public class RegexUtilities
{
   bool invalid = false;

   public bool IsValidEmail(string strIn)
   {
       invalid = false;
       if (String.IsNullOrEmpty(strIn))
          return false;

       // Use IdnMapping class to convert Unicode domain names.
       strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper);
       if (invalid) 
          return false;

       // Return true if strIn is in valid e-mail format.
       return Regex.IsMatch(strIn, 
              @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + 
              @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$", 
              RegexOptions.IgnoreCase);
   }

   private string DomainMapper(Match match)
   {
      // IdnMapping class with default property values.
      IdnMapping idn = new IdnMapping();

      string domainName = match.Groups[2].Value;
      try {
         domainName = idn.GetAscii(domainName);
      }
      catch (ArgumentException) {
         invalid = true;      
      }      
      return match.Groups[1].Value + domainName;
   }
}

否则,如果是用于用户注册,我通常只依赖电子邮件验证 - 即系统向用户发送一封带有链接的电子邮件,然后单击该链接会验证该电子邮件地址是真实的。

有效的电子邮件地址可能不是真实的。换句话说,它甚至可以通过一个完美的验证系统,但这并不能保证它存在。

于 2012-09-21T22:38:50.410 回答