C# 验证电子邮件地址的C代码

C# 验证电子邮件地址的C代码,c#,email,email-validation,C#,Email,Email Validation,验证字符串是否为有效电子邮件地址的最优雅的代码是什么?我个人认为,您应该确保其中有一个@符号,可能还有一个。性格有许多正则表达式可以使用不同的正确性,但我认为大多数都忽略了有效的电子邮件地址,或者让无效的电子邮件地址通过。如果人们想输入一个假的电子邮件地址,他们会输入一个假的。如果您需要验证电子邮件地址是否合法,以及此人是否控制该电子邮件地址,则您需要向他们发送一封带有特殊编码链接的电子邮件,以便他们能够验证该电子邮件地址是否真实。电子邮件地址验证并不像看上去那么容易。从理论上讲,仅仅使用正则表

验证字符串是否为有效电子邮件地址的最优雅的代码是什么?

我个人认为,您应该确保其中有一个@符号,可能还有一个。性格有许多正则表达式可以使用不同的正确性,但我认为大多数都忽略了有效的电子邮件地址,或者让无效的电子邮件地址通过。如果人们想输入一个假的电子邮件地址,他们会输入一个假的。如果您需要验证电子邮件地址是否合法,以及此人是否控制该电子邮件地址,则您需要向他们发送一封带有特殊编码链接的电子邮件,以便他们能够验证该电子邮件地址是否真实。

电子邮件地址验证并不像看上去那么容易。从理论上讲,仅仅使用正则表达式完全验证电子邮件地址是不可能的


请查看我关于它的介绍,了解关于该主题的讨论以及使用FParsec的F实现。[/chameless\u plug]

老实说,在生产代码中,我最好检查@符号


我从来没有一个地方可以完全验证电子邮件。你知道我怎么看它是否真的有效吗?如果它被发送了。如果没有,那就糟了,如果有,生活就好了。这就是我所需要知道的。

我发现这个正则表达式在检查@标记以外的内容和接受奇怪的边缘情况之间是一个很好的折衷:

^[^@\s]+@[^@\s]+(\.[^@\s]+)+$

它至少会让你在@标记周围放上一些东西,并且至少放上一个看起来正常的域。

如果你真的想知道电子邮件地址是否有效……请邮件交换者证明,不需要正则表达式。如果需要,我可以提供代码

一般步骤如下: 1.电子邮件地址有域名部分吗?@>0的索引 2.使用DNS查询询问域是否有邮件交换器 3.打开到邮件交换器的tcp连接 4.使用smtp协议,使用电子邮件地址作为收件人向服务器打开邮件 5.解析服务器的响应。 6.退出邮件如果你做到这一步,一切都很好

您可以想象,这在时间上非常昂贵,并且依赖smtp,但它确实可以工作。

这是怎么回事

bool IsValidEmail(string email)
{
    try {
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    }
    catch {
        return false;
    }
}
根据Stuart的评论,这会将最终地址与原始字符串进行比较,而不是总是返回true。MailAddress尝试将带有空格的字符串解析为显示名称和地址部分,因此原始版本返回了误报

为了澄清,问题是询问特定字符串是否是电子邮件地址的有效表示形式,而不是电子邮件地址是否是发送消息的有效目的地。对于这一点,唯一真正的方法是发送消息确认

请注意,电子邮件地址比您最初设想的更宽容。这些都是完全有效的表格:

cog@wheel 齿轮orange@example.com 123@$.xyz 对于大多数用例,对于用户和将来的校对来说,假无效比假有效更糟糕。这个问题的答案已经被删除了。关于如何解决这个问题,它有更多的细节和其他一些想法


提供健全性检查对于用户体验来说仍然是一个好主意。假设电子邮件地址有效,您可以查找已知的顶级域,检查域中的MX记录,检查常见域名gmail.cmo中的拼写错误,等等。然后给出一个警告,让用户有机会说是,一般来说,我的邮件服务器确实允许,验证电子邮件地址的正则表达式不是一件容易想到的事情;在撰写本文时,电子邮件地址的语法必须遵循相当多的标准,而在正则表达式中实现所有这些标准实际上是不可行的

我强烈建议您尝试我们的,一个成熟的.NET库,它可以验证符合所有当前IETF标准RFC 1123、RFC 2821、RFC 2822、RFC 3696、RFC 4291、RFC 5321和RFC 5322的电子邮件地址,测试相关DNS记录,检查目标邮箱是否可以接受邮件,甚至可以判断给定地址是否为一次性地址


免责声明:我是该组件的首席开发人员。

我从1中获取Phil的答案并创建了这个类。 这样称呼它:bool isValid=Validator.EmailIsValidemailString

下面是课堂:

using System.Text.RegularExpressions;

public static class Validator
{

    static Regex ValidEmailRegex = CreateValidEmailRegex();

    /// <summary>
    /// Taken from http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx
    /// </summary>
    /// <returns></returns>
    private static Regex CreateValidEmailRegex()
    {
        string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
            + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
            + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

        return new Regex(validEmailPattern, RegexOptions.IgnoreCase);
    }

    internal static bool EmailIsValid(string emailAddress)
    {
        bool isValid = ValidEmailRegex.IsMatch(emailAddress);

        return isValid;
    }
}

这是一个老问题,但我在上面找到的所有答案,包括最近的答案,都与这个答案类似。但是,在.Net 4.5/MVC 4中,您可以通过添加System.ComponentModel.DataAnnotations中的[EmailAddress]注释,将电子邮件地址验证添加到表单中,因此我想知道为什么不能一般使用.Net中的内置功能

这似乎有效,而且在我看来相当优雅:

using System.ComponentModel.DataAnnotations;

class ValidateSomeEmails
{
    static void Main(string[] args)
    {
        var foo = new EmailAddressAttribute();
        bool bar;
        bar = foo.IsValid("someone@somewhere.com");         //true
        bar = foo.IsValid("someone@somewhere.co.uk");       //true
        bar = foo.IsValid("someone+tag@somewhere.net");     //true
        bar = foo.IsValid("futureTLD@somewhere.fooo");      //true

        bar = foo.IsValid("fdsa");                          //false
        bar = foo.IsValid("fdsa@");                         //false
        bar = foo.IsValid("fdsa@fdsa");                     //false
        bar = foo.IsValid("fdsa@fdsa.");                    //false

        //one-liner
        if (new EmailAddressAttribute().IsValid("someone@somewhere.com"))
            bar = true;    
    }
}

我认为最好的办法如下:

    public static bool EmailIsValid(string email)
    {
        string expression = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";

        if (Regex.IsMatch(email, expression))
        {
            if (Regex.Replace(email, expression, string.Empty).Length == 0)
            {
                return true;
            }
        }
        return false;
    }
您可以在常规类中使用此静态函数。

.net 4.5已添加

您可以浏览,这是它内部使用的正则表达式:< /p>
下面是我的答案-Phil的解决方案对于单字母域(如someone@q.com. 信不信由你,例如,这是used=进入centurylink

菲尔的回答也只适用于PCRE标准。。。所以C会接受它,但是javascript会爆炸。它对于javascript来说太复杂了。因此,您不能将Phil的解决方案用于mvc验证属性

这是我的正则表达式。它将很好地与MVC验证属性配合使用。 -@之前的一切都被简化了,所以至少javascript可以工作。只要exchange server不给我5.1.3版本,我就可以在这里放松验证。 -@之后的所有内容都是针对单字母域修改的Phil解决方案

public const string EmailPattern =
        @"^\s*[\w\-\+_']+(\.[\w\-\+_']+)*\@[A-Za-z0-9]([\w\.-]*[A-Za-z0-9])?\.[A-Za-z][A-Za-z\.]*[A-Za-z]$";

对于建议使用system.net.mail MailMessage的人来说,这是一种灵活的方式。当然,C将接受电子邮件,但当您尝试发送电子邮件时,exchange server将立即出现5.1.3运行时错误。

检查电子邮件字符串的格式是否正确。Text.regular表达式:

private static bool IsValidEmail(string emailAddress)
{
    const string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
                                     + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
                                     + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

    return new Regex(validEmailPattern, RegexOptions.IgnoreCase).IsMatch(emailAddress);
}

/使用用于创建新EmailAddressAttribute的内部正则表达式;.Net4.5>>>中的组件,使用System.ComponentModel.DataAnnotations; //要验证电子邮件地址……已测试并正常工作

public bool IsEmail(string email)
{
    if (String.IsNullOrEmpty(email))
    {   return false;  }
    try
    {
        Regex _regex = new Regex("^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])" +
                "+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)" +
                "((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|" +
                "[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\u" +
                "FDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|" +
                "(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|" +
                "[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900" +
                "-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF" +
                "EF])))\\.?$", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
        return _regex.IsMatch(email);
    }
    catch (RegexMatchTimeoutException)
    {
        return false;
    }
}
此外,您还可以使用:


我使用这种单线性方法,它为我完成了这项工作-

using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
    return new EmailAddressAttribute().IsValid(source);
}
根据注释,如果电子邮件地址的来源为空,则此操作将失败

public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);

我把Poyson 1的回答简单化如下:

public static bool IsValidEmailAddress(string candidateEmailAddr)
{
    string regexExpresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    return (Regex.IsMatch(candidateEmailAddr, regexExpresion)) && 
           (Regex.Replace(candidateEmailAddr, regexExpresion, string.Empty).Length == 0);
}

最优雅的方法是使用.Net的内置方法

这些方法:

都经过了考验。这些方法在我自己的专业项目中使用

在内部使用可靠且快速的正则表达式

由微软为C制造。没有必要重新发明轮子

返回布尔结果。True表示电子邮件有效

适用于.Net 4.5及更高版本的用户

将此引用添加到您的项目:

System.ComponentModel.DataAnnotations

现在,您可以使用以下代码:

(new EmailAddressAttribute().IsValid("youremailhere@test.test"));
使用示例

以下是一些要声明的方法:

protected List<string> GetRecipients() // Gets recipients from TextBox named `TxtRecipients`
{
    List<string> MethodResult = null;

    try
    {
        List<string> Recipients = TxtRecipients.Text.Replace(",",";").Replace(" ", "").Split(';').ToList();

        List<string> RecipientsCleaned = new List<string>();

        foreach (string Recipient in RecipientsCleaned)
        {
            if (!String.IsNullOrWhiteSpace(Recipient))
            {
                RecipientsNoBlanks.Add(Recipient);

            }

        }

        MethodResult = RecipientsNoBlanks;

    }
    catch//(Exception ex)
    {
        //ex.HandleException();
    }

    return MethodResult;

}


public static bool IsValidEmailAddresses(List<string> recipients)
{
    List<string> InvalidAddresses = GetInvalidEmailAddresses(recipients);

    return InvalidAddresses != null && InvalidAddresses.Count == 0;

}

public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
    List<string> MethodResult = null;

    try
    {
        List<string> InvalidEmailAddresses = new List<string>();

        foreach (string Recipient in recipients)
        {
            if (!(new EmailAddressAttribute().IsValid(Recipient)) && !InvalidEmailAddresses.Contains(Recipient))
            {
                InvalidEmailAddresses.Add(Recipient);

            }

        }

        MethodResult = InvalidEmailAddresses;

    }
    catch//(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}

这是你问题的答案供你核对

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

public class RegexUtilities
{    
   public bool IsValidEmail(string strIn)
   {
       if (String.IsNullOrEmpty(strIn))
       {
          return false;

       }

       // Use IdnMapping class to convert Unicode domain names.

       try 
       {
          strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper, RegexOptions.None, TimeSpan.FromMilliseconds(200));

       }
       catch (RegexMatchTimeoutException) 
       {
           return false;

       }

       if (invalid)
       {
           return false;

       }

       // Return true if strIn is in valid e-mail format.    

       try 
       {
          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][\-a-z0-9]{0,22}[a-z0-9]))$", RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));

       }
       catch (RegexMatchTimeoutException) 
       {
          return false;

       }

   }


   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;

   }

}

识别emailid是否有效的简单方法

public static bool EmailIsValid(string email)
{
        return Regex.IsMatch(email, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}

C中的正则表达式而不是js中的正则表达式存在区域性问题。因此,我们需要在美国模式下使用regex进行电子邮件检查。如果不使用ECMAScript模式,您的语言特殊字符将在带有regex的A-Z中暗示

Regex.IsMatch(email, @"^([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})(\]?)$", RegexOptions.ECMAScript)

我最终使用了这个正则表达式,因为它成功地验证了逗号、注释、Unicode字符和IPv4域地址

有效地址为:

@example.org

commenttest@example.org

ццСц@example.org

ტესტი@example.org

测试@[192.168.1.1]


一个不使用Regex的简单示例,我不喜欢它的可读性差:

bool IsValidEmail(string email)
{
    string emailTrimed = email.Trim();

    if (!string.IsNullOrEmpty(emailTrimed))
    {
        bool hasWhitespace = emailTrimed.Contains(" ");

        int indexOfAtSign = emailTrimed.LastIndexOf('@');

        if (indexOfAtSign > 0 && !hasWhitespace)
        {
            string afterAtSign = emailTrimed.Substring(indexOfAtSign + 1);

            int indexOfDotAfterAtSign = afterAtSign.LastIndexOf('.');

            if (indexOfDotAfterAtSign > 0 && afterAtSign.Substring(indexOfDotAfterAtSign).Length > 1)
                return true;
        }
    }

    return false;
}
示例:

IsValidEmail@b.com//错 IsValidEmaila@.com//错 IsValidEmaila@bcom//错 伊斯瓦利德梅拉。b@com//错 IsValidEmaila@b. // 错误的 伊斯瓦利德梅拉b@c.com//错 IsValidEmaila@bc.com//false IsValidEmaila@b.com//对 IsValidEmaila@b.c.com//对 伊斯瓦利德梅拉+b@c.com//对 IsValidEmaila@123.45.67.89//对 这意味着它很简单,因此它不会处理罕见的情况,如带有括号的域(通常允许包含空格)的电子邮件、带有IPv6地址的电子邮件等。

简短而准确的代码

For the simple email like goerge@xxx.com, below code is sufficient. 

 public static bool ValidateEmail(string email)
        {
            System.Text.RegularExpressions.Regex emailRegex = new System.Text.RegularExpressions.Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
            System.Text.RegularExpressions.Match emailMatch = emailRegex.Match(email);
            return emailMatch.Success;
        }
如果您正在使用,您可以编写如下简单内容:

public cass User
{
    public string Email { get; set; }
}

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        RuleFor(x => x.Email).EmailAddress().WithMessage("The text entered is not a valid email address.");
    }
}

// Validates an user. 
var validationResult = new UserValidator().Validate(new User { Email = "açflkdj" });

// This will return false, since the user email is not valid.
bool userIsValid = validationResult.IsValid;

对@Cogwheel答案的一点修改

public static bool IsValidEmail(this string email)
{
  // skip the exception & return early if possible
  if (email.IndexOf("@") <= 0) return false;

  try
  {
    var address = new MailAddress(email);
    return address.Address == email;
  }
  catch
  {
    return false;
  }
}

这里有很多强有力的答案。然而,我建议我们后退一步@齿轮回答了这个问题。然而,如果正在验证的许多电子邮件地址无效,则在批量验证场景中可能会花费高昂的成本。我建议我们在进入他的“尝试-抓住”阶段之前先用一点逻辑。我知道下面的代码可以使用RegEx编写,但是对于新开发人员来说,理解这些代码的成本可能会很高。这是我的两便士:

    public static bool IsEmail(this string input)
    {
        if (string.IsNullOrWhiteSpace(input)) return false;

        // MUST CONTAIN ONE AND ONLY ONE @
        var atCount = input.Count(c => c == '@');
        if (atCount != 1) return false;

        // MUST CONTAIN PERIOD
        if (!input.Contains(".")) return false;

        // @ MUST OCCUR BEFORE LAST PERIOD
        var indexOfAt = input.IndexOf("@", StringComparison.Ordinal);
        var lastIndexOfPeriod = input.LastIndexOf(".", StringComparison.Ordinal);
        var atBeforeLastPeriod = lastIndexOfPeriod > indexOfAt;
        if (!atBeforeLastPeriod) return false;

        // CODE FROM COGWHEEL'S ANSWER: https://stackoverflow.com/a/1374644/388267 
        try
        {
            var addr = new System.Net.Mail.MailAddress(input);
            return addr.Address == input;
        }
        catch
        {
            return false;
        }
    }

@Cogwheel中投票最多的答案是最好的答案,但是我已经尝试实现了trim string方法,所以它将从字符串开始到结束修剪所有用户空白。检查下面的代码以获取完整示例-

bool IsValidEmail(string email)
{
    try
    {
        email = email.Trim();
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    }
    catch
    {
        return false;
    }
}

我只想指出,.NET文档中最近增加了一项关于电子邮件验证的内容,也使用了Regex操作。 可以在那里找到对其实现的详细解释

为方便起见,以下是他们的测试结果列表:

//       Valid: david.jones@proseware.com
//       Valid: d.j@server1.proseware.com
//       Valid: jones@ms1.proseware.com
//       Invalid: j.@server1.proseware.com
//       Valid: j@proseware.com9
//       Valid: js#internal@proseware.com
//       Valid: j_9@[129.126.118.1]
//       Invalid: j..s@proseware.com
//       Invalid: js*@proseware.com
//       Invalid: js@proseware..com
//       Valid: js@proseware.com9
//       Valid: j.s@server1.proseware.com
//       Valid: "j\"s\""@proseware.com
//       Valid: js@contoso.中国

请看Phil Haack的文章:除了字符串之外,还有许多其他重要的验证,最好检查此smtp服务器上是否存在电子邮件,或者用户是否正在输入任何电子邮件。。等,或使用API,将为您处理,以确保电子邮件是正确的像最好的lnk从微软你可以使用图书馆;很有趣,有趣的文章。但说真的,是谁在电子邮件地址中添加评论,以及嵌套的评论呢?@matthew我不知道IETF为什么有e

维恩允许这样做,但这是可能的,所以彻底的验证必须考虑到这一点。我个人认为你应该做更多的验证。有人一定会尝试Bobby Table的电子邮件地址,或者更糟。如果您使用的是预先准备好的语句,Bobby Table的电子邮件地址有什么问题。我们谈论的是有效的电子邮件地址,而不是其他与有效电子邮件地址的构成无关的东西,比如如何正确地执行SQL查询,这样就不会出现SQL注入问题。我想你不知道有人会在其中输入什么,但恶意的人知道这些值最终可能会输入到你的邮件系统中。我更喜欢深入防御,更严格一点。这是邮件系统需要担心的。我不会到处拒绝完全有效的电子邮件地址,因为这可能是其他系统的安全问题。如果您的电子邮件服务器需要的只是一个格式错误的电子邮件地址,从而导致安全问题,那么您可能应该切换到另一个服务器。只有在您的每个安全级别都未损坏的情况下,深度防御才有效。一层腐烂就意味着你把整个洋葱都弄坏了。拒绝foo@example.com.au因为您想防御Sun的µ-law编码中的漏洞是没有意义的,是吗?别笑,这是我的事。我在这里发表评论的原因是澳大利亚医疗保险不允许.au地址,只允许.com地址。还可以阅读马克·斯旺森的《如何不验证电子邮件》,事实上,这并不错误。a@a是一个有效的电子邮件地址。请看,实际上,如果使用带引号的地址,此方法会返回不正确的结果。+1:如果使用System.Net.Mail类发送邮件,这是最好的答案,如果使用.Net,则可能是这样。我们之所以决定使用这种类型的验证,仅仅是因为我们没有必要接受我们无法发送邮件的电子邮件地址,即使是有效的地址。我不建议这样做。它返回true:IsValidMilthis不是valid@email$com;很多问题似乎是因为MailAddress也试图解析DisplayName,所以很简单space@domain.com解析为DisplayName和single Addressspace@domain.com. 解决方法是:返回地址==电子邮件;我喜欢这样;我没有比实际规范更严格的强制要求。误报比误报更糟糕。你说我的电子邮件无效是什么意思?你是否为这些接口创建了赝品、存根和/或模拟?那是行不通的。用于验证电子邮件地址的smtp协议早就被弃用/未使用。在邮件服务器上启用该功能被认为是不好的做法,因为垃圾邮件发送者使用该功能。比检查已知的域名模式更能证明未来。吹毛求疵,但define有邮件交换器吗?如果不存在MX记录,SMTP应根据RFC2821/5321退回到A/AAAA记录。如果MX记录确实存在,则仍可能不表示存在邮件交换器RFC7505。实际上,唯一的方法是向他们发送一封带有call to action链接的邮件,然后等待他们回复……不幸的是,EmaillAddressAttribute允许使用对其无效的字符email@BZ是的。你为什么不这么认为?@Chad Grant:这是C版本。你能提供一个VB.Net版本吗。因为这将转义\\to\之类的字符,或者您可以提供一个逐字字符串。这是可行的,但不要忘记RegexOptions.IgnoreCase,因为此模式不允许显式使用大写字母!请注意,Regex非常谨慎:该属性提供与jquery validate等效的服务器端电子邮件验证,因此共享相同的正则表达式!string.IsNullOrEmptyemailAddress&&ValidEmailRegex.IsMatchemailAddress;这简直是恐怖:这不会验证具有1个字符域的电子邮件。即:bla@a.com@你运行代码了吗?上次有人说它不工作时,我启动了一个编码环境,它确实正确地进行了验证。我已经8年没有使用C了,我真的很好奇你是否知道它不起作用,或者你是否正在阅读代码并说它不起作用。这似乎是最好的、最深思熟虑的/最合理的/真实的答案,谢谢Ralph!这是迄今为止最好的答案!我真不敢相信一个可以接受的糟糕的解决方案basket@ball因为一个有效的电子邮件地址已经获得了正确的答案以及所有的投票。无论如何谢谢你!谢谢,这是最好的解决方案,应该被大家接受。很酷,不过令人失望的是,微软不能同意这一点。这拒绝了js@proseware.com9Note该EmailAddress属性的权限小于System.Net.Mail.MailAddress-例如,MailAddress接受TLD的地址。如果你需要尽可能的宽容,请记住一些东西。@Cogwheel:如果答案在注释中的某个地方,则可能应该添加到答案的主体。@hofnarwillie:答案在主体中,但注释是elabor

吃了。如果您的目标是不激怒用户,那么您的验证不应比规范更严格。真正验证电子邮件是否有效的唯一方法是发送测试消息。请注意foo.IsValidnull;返回true。这封邮件的回复为true:fulya_42_@hotmail.coö并且它在mandrill apiFirst中抛出错误,这封邮件是有效的w.r.t。example@example.co或example@example.com....The电子邮件中除了最后一个字符ö之外,还有所有有效的字符串和标准,您可以轻松添加一个简单的条件来验证这些字符。其次,我不确定mandrill api的错误,您可能想验证您的使用方法bcos我已经在其他一些环境/api上使用了此验证,它对我很好。令人印象深刻!接下来,它尝试联系负责给定电子邮件地址的邮件交换器,并与该服务器开始一个模拟真实邮件服务器的假SMTP对话框。这样可以确保服务器可以处理该地址的电子邮件。许多SMTP服务器实际上会返回假阳性答案以防止垃圾邮件发送者:为了克服这个问题,EmailVerify for.NET最终尝试使用不同的伪造地址多次查询目标邮件交换器。谢谢,马修洛克;不错,但我只看到付费版。有关于社区/开源版本的计划吗?@OhadSchneider有:我们正在通过我们的SaaS Verifalia提供免费版本的电子邮件验证技术。Verifalia为主要软件开发平台提供了免费的开源SDK,包括;我得到,“数据批注”不存在…是否缺少程序集引用?我需要添加哪个引用?如果source为null,则返回true。如果指定的值有效或为null,请参见true;否则为false。更好的版本是:publicstaticboolean isvalidMailAddressThisString pThis=>pThis==null?false:新建EmailAddressAttribute.IsValidpThis;或者更好:公共静态bool isvalidemailaddress此字符串地址=>address!=null&新建EmailAddressAttribute.IsValidaddress;我认为这个扩展方法不应该为空字符串默默地返回false。这就是为什么我提出了更好的++版本:publicstaticbool isvalidemailaddress这个字符串地址=>新的EmailAddressAttribute.IsValidaddress??抛出新的ArgumentNullException;。我现在要去寻找由更好的版本主义者组成的改革宗教堂;虽然此答案不接受域部分中的TLD,但它确实允许使用无效字符。@Simone可能没有人在域部分中有TLD的电子邮件地址,但实际上:请注意,在注释中可能禁止使用这些TLDdays@MatthewLock可能是内部网地址吗?喜欢bob@companyinternal?@Simone现实生活中是否有人实际使用该方案?此答案不接受域部分中带有TLD的地址。@ThomasAyoub我没有看到EmailAddressAttribute答案,也没有使用带有检查输入==.address的new MailAddress的答案,因此我认为它非常有用。没有阅读评论,公认的答案是非常错误的。新MailAddressFoobarSome@thing.com证明了这一点。@Jan fwiw,在EmailAddressAttribute方面比Knickerless领先了不到四个月,虽然这一个确实捕获了空问题,但它将无法验证a@b.info作为有效的电子邮件地址。感谢您的解决方案,我必须将公共静态bool isvalidemailt此字符串电子邮件更改为公共静态bool IsValidEmailstring电子邮件以避免此问题:@Goner Doug,此函数的工作方式如下。bool flag=EmailAddress.IsValidMail此函数需要删除,以避免在添加到我的表单时导致编译器问题。@Goner Doug,其函数的工作方式如下。字符串电子邮件=abc@xyz.com; 如果email.IsValidEmail{return false;}否则{return true;}这似乎没有帮助。。。安慰WriteLineMailAddressasdf@asdf..Address; 输出asdf@asdf.,这是无效的..net似乎有自己的valid定义。与此相关的风险是,您正在验证与源不同的电子邮件地址,这使您认为可以将邮件发送到指定电子邮件地址的未修剪版本。更好的方法是创建一个单独的方法SanitizeEmailstring email,使用该方法的结果验证电子邮件并将其发送到。
string Email = txtEmail.Text;
if (Email.IsValidEmail())
{
   //use code here 
}

public static bool IsValidEmail(this string email)
{
  string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|" + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";    
  var regex = new Regex(pattern, RegexOptions.IgnoreCase);    
  return regex.IsMatch(email);
}
public cass User
{
    public string Email { get; set; }
}

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        RuleFor(x => x.Email).EmailAddress().WithMessage("The text entered is not a valid email address.");
    }
}

// Validates an user. 
var validationResult = new UserValidator().Validate(new User { Email = "açflkdj" });

// This will return false, since the user email is not valid.
bool userIsValid = validationResult.IsValid;
public static bool IsValidEmail(this string email)
{
  // skip the exception & return early if possible
  if (email.IndexOf("@") <= 0) return false;

  try
  {
    var address = new MailAddress(email);
    return address.Address == email;
  }
  catch
  {
    return false;
  }
}
    public static bool IsEmail(this string input)
    {
        if (string.IsNullOrWhiteSpace(input)) return false;

        // MUST CONTAIN ONE AND ONLY ONE @
        var atCount = input.Count(c => c == '@');
        if (atCount != 1) return false;

        // MUST CONTAIN PERIOD
        if (!input.Contains(".")) return false;

        // @ MUST OCCUR BEFORE LAST PERIOD
        var indexOfAt = input.IndexOf("@", StringComparison.Ordinal);
        var lastIndexOfPeriod = input.LastIndexOf(".", StringComparison.Ordinal);
        var atBeforeLastPeriod = lastIndexOfPeriod > indexOfAt;
        if (!atBeforeLastPeriod) return false;

        // CODE FROM COGWHEEL'S ANSWER: https://stackoverflow.com/a/1374644/388267 
        try
        {
            var addr = new System.Net.Mail.MailAddress(input);
            return addr.Address == input;
        }
        catch
        {
            return false;
        }
    }
bool IsValidEmail(string email)
{
    try
    {
        email = email.Trim();
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    }
    catch
    {
        return false;
    }
}
//       Valid: david.jones@proseware.com
//       Valid: d.j@server1.proseware.com
//       Valid: jones@ms1.proseware.com
//       Invalid: j.@server1.proseware.com
//       Valid: j@proseware.com9
//       Valid: js#internal@proseware.com
//       Valid: j_9@[129.126.118.1]
//       Invalid: j..s@proseware.com
//       Invalid: js*@proseware.com
//       Invalid: js@proseware..com
//       Valid: js@proseware.com9
//       Valid: j.s@server1.proseware.com
//       Valid: "j\"s\""@proseware.com
//       Valid: js@contoso.中国