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

C# code to validate email address

提问人:leora 提问时间:9/2/2009 最后编辑:Artemixleora 更新时间:2/18/2023 访问量:643753

问:

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

C# 电子邮件验证

评论

10赞 Noon Silk 9/2/2009
regular-expressions.info/email.html
10赞 Luke Quinane 9/2/2009
看看 Phil Haack 的文章:“在我阅读 RFC 之前,我知道如何验证电子邮件地址"
0赞 Amr Magdy 5/26/2016
除了字符串之外,还有许多其他重要的验证,最好检查此SMTP服务器上是否存在电子邮件,或者用户是否正在输入任何电子邮件。等等,或者使用API来处理这个问题,以确保电子邮件是正确的,比如 ver-email.com
0赞 Kishore Sahasranaman 12/3/2017
来自微软的最佳 lnk learn.microsoft.com/en-us/dotnet/standard/base-types/...
0赞 Mohammad Reza Sadreddini 10/6/2019
您可以使用 github.com/jstedfast/EmailValidation 库。

答:

37赞 Kibbee 9/2/2009 #1

就我个人而言,我会说你应该确保那里有一个@符号,可能有一个.字符。您可以使用许多正确度不同的正则表达式,但我认为其中大多数都省略了有效的电子邮件地址,或者让无效的电子邮件地址通过。如果人们想输入一个假的电子邮件地址,他们会输入一个假的。如果您需要验证电子邮件地址是否合法,并且该人控制该电子邮件地址,那么您需要向他们发送一封带有特殊编码链接的电子邮件,以便他们可以验证它确实是一个真实的地址。

评论

6赞 Luke Quinane 9/2/2009
我个人认为你应该做更多的验证。有人一定会尝试 Bobby Table 的电子邮件地址或更糟的情况。
33赞 Kibbee 9/2/2009
如果您使用的是准备好的语句,那么 bobby table 的电子邮件地址有什么问题。我们谈论的是有效的电子邮件地址,而不是其他与构成有效电子邮件地址无关的东西,例如如何正确执行 SQL 查询,以免遇到 SQL 注入问题。
0赞 Luke Quinane 9/2/2009
我猜你不知道有人会放什么,但恶意的人知道这些价值最终可能会被输入到你的邮件系统中。我只是更喜欢深度防守,更严格一点。
11赞 Kibbee 9/2/2009
这是邮件系统需要担心的。我不会仅仅因为它可能是其他系统的安全问题而拒绝完全有效的电子邮件地址。如果您的电子邮件服务器只需要一个格式错误的电子邮件地址来导致安全问题,您可能应该切换到另一台服务器。
4赞 ManicDee 11/22/2013
纵深防御只有在你的安全洋葱的每一层都没有腐烂的情况下才有效。一层烂意味着你破坏了整个洋葱。拒绝“[email protected]”是因为你想防御 Sun μ定律编码中的漏洞是没有意义的,不是吗?别笑,这发生在我身上。我在这里发表评论的原因是,澳大利亚医疗保险不允许“.au”地址,只允许“.com”。另请阅读马克·斯旺森(Mark Swanson),“如何不验证电子邮件”,mdswanson.com/blog/2013/10/14/...
5赞 Mauricio Scheffer 9/2/2009 #2

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

查看我关于它的博客文章,了解有关该主题的讨论以及使用 FParsec 的 F# 实现。[/shameless_plug]

评论

1赞 Luke Quinane 9/2/2009
我喜欢你的替代方法列表;很有意思。
1赞 Matthew Lock 9/2/2009
有趣的文章。但说真的,谁在电子邮件地址中放置评论和嵌套评论?
3赞 Mauricio Scheffer 9/2/2009
@matthew我不知道为什么 IETF 甚至允许这样做,但这是可能的,所以必须考虑到彻底的验证。
11赞 Noon Silk 9/2/2009 #3

老实说,在生产代码中,我做的最好的事情就是检查符号。@

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

7赞 Matthew Lock 9/2/2009 #4

我发现这个正则表达式是一个很好的权衡,既检查了 @ 标记之外的东西,又接受了奇怪的边缘情况:

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

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

评论

0赞 Stefan 1/24/2017
我想出了同样的正则表达式;)不过,它确实允许无效字符
0赞 Simone 5/23/2017
此答案不接受域部分的 TLD。
0赞 Matthew Lock 5/24/2017
@Simone可能没有人在域名部分拥有带有 TLD 的电子邮件地址,尽管在实践中:serverfault.com/a/721929/167961 评论中指出,这些天可能会被禁止
0赞 Simone 5/24/2017
@MatthewLock 会不会是内网地址?喜欢?bob@companyinternal
0赞 Matthew Lock 5/24/2017
现实生活中有人@Simone实际使用这种方案?
3赞 Joe Caffeine 9/2/2009 #5

如果你真的,我的意思是真的想知道一个电子邮件地址是否有效......要求邮件交换器证明这一点,不需要正则表达式。如果需要,我可以提供代码。

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

正如您可以想象的那样,这在时间上非常昂贵,并且依赖于 smtp,但它确实有效。

评论

0赞 Mark A 9/21/2012
您是否为这些接口创建了假货、存根和/或模拟?
2赞 Chad Grant 9/10/2013
那行不通。用于验证电子邮件地址的 smtp 协议早已被弃用/未使用。在邮件服务器上启用此功能被认为是不好的做法,因为垃圾邮件发送者使用该功能。
0赞 Simone 5/23/2017
我会将您的建议保留到第 2 点。比检查已知的域名模式更能适应未来。
0赞 jimbobmcgee 5/31/2017
吹毛求疵,但定义“有邮件交换器”?如果不存在 MX 记录,则 SMTP 应根据 RFC2821/5321 回退到 A/AAAA 记录。如果 MX 记录确实存在,它可能仍然不表示存在邮件交换器 (RFC7505)。真的,唯一的方法是向他们发送一封带有号召性用语链接的邮件,然后等待他们回复......
1020赞 Cogwheel 9/4/2009 #6

这又如何呢?

bool IsValidEmail(string email)
{
    var trimmedEmail = email.Trim();

    if (trimmedEmail.EndsWith(".")) {
        return false; // suggested by @TK-421
    }
    try {
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == trimmedEmail;
    }
    catch {
        return false;
    }
}

根据 Stuart 的评论,这会将最终地址与原始字符串进行比较,而不是始终返回 true。MailAddress 尝试将带有空格的字符串解析为“显示名称”和“地址”部分,因此原始版本返回误报。


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

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

  • cog@wheel
  • “橙色齿轮”@example.com
  • 123@$.xyz

对于大多数用例来说,虚假的“无效”比虚假的“有效”对用户和未来证明要糟糕得多。这是一篇文章,曾经是这个问题的公认答案(该答案已被删除)。它有更多细节和一些关于如何解决问题的其他想法。

提供健全性检查对于用户体验来说仍然是一个好主意。假设电子邮件地址有效,您可以查找已知的顶级域,检查域中的 MX 记录,检查常见域名 (gmail.cmo) 的拼写错误等。然后显示一个警告,让用户有机会说“是的,我的邮件服务器确实允许🌮🍳🎁作为电子邮件地址。


至于对业务逻辑使用异常处理,我同意这是要避免的事情。但这是便利性和清晰度可能超过教条的情况之一。

此外,如果您对电子邮件地址执行任何其他操作,则可能涉及将其转换为MailAddress。即使您不使用此确切的函数,您也可能希望使用相同的模式。您还可以通过捕获不同的异常来检查特定类型的故障:null、空或无效格式。


--- 延伸阅读---

System.Net.Mail.MailAddress 的文档

有效电子邮件地址的构成说明

评论

25赞 Cogwheel 10/15/2009
实际上,这并没有错。a@a 是有效的电子邮件地址。查看 haacked.com/archive/2007/08/21/...事实上,如果您使用带引号的地址,此方法确实会返回不正确的结果。
58赞 Greg Beech 2/26/2010
+1:如果您使用这些类发送邮件,这是最佳答案,如果您使用的是 .NET,则可能是最佳答案。我们之所以决定使用这种类型的验证,仅仅是因为我们不能接受我们无法向其发送邮件的电子邮件地址(即使是有效的电子邮件地址)是没有意义的。System.Net.Mail
32赞 Kakashi 12/12/2011
我不推荐。它返回 true:IsValidEmail("this is not valid@email$com");
18赞 Stuart 5/27/2014
很多问题似乎是因为 MailAddress 也尝试解析 DisplayName,因此“single [email protected]”解析为 DisplayName “single” 和 Address “[email protected]”。对此的解决方法是:return (addr.地址 == 电子邮件);
19赞 Casey 7/31/2014
我喜欢这个;我不认为强迫症比实际规范更严格。漏报比误报更糟糕(“你的意思是我的电子邮件无效?")
2赞 Efran Cobisi 9/22/2011 #7

一般来说,验证电子邮件地址的正则表达式并不是一件容易的事情。在撰写本文时,电子邮件地址的语法必须遵循相对较多的标准,并且在正则表达式中实现所有这些标准实际上是不可行的!

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

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

评论

0赞 Matthew Lock 10/22/2015
令人 印象 深刻!“接下来,它试图联系负责给定电子邮件地址的邮件交换器,并开始与该服务器进行虚假的SMTP对话,模拟真实的邮件服务器。这样,它可以确保服务器可以处理该地址的电子邮件。许多 SMTP 服务器实际上会返回误报答案,以防止垃圾邮件发送者:为了克服此问题,EmailVerify for .NET 最终尝试使用不同的伪造地址多次查询目标邮件交换器。"
0赞 Efran Cobisi 10/23/2015
谢谢,@MatthewLock ;)
0赞 Ohad Schneider 7/15/2017
不错,但我只看到付费版本。有社区/开源版的计划吗?
1赞 Efran Cobisi 7/16/2017
@OhadSchneider 是的:我们通过我们的 SaaS 电子邮件验证服务 Verifalia 提供免费版本的电子邮件验证技术。Verifalia 为主要软件开发平台(包括 .NET)提供免费和开源 SDK。
47赞 David Silva Smith 12/19/2011 #8

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

这是课程:

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;
    }
}

评论

5赞 Marc 11/15/2013
只是一个很小的,但我会使用:return (!string.IsNullOrEmpty(emailAddress)) & ValidEmailRegex.IsMatch(emailAddress);
1赞 Alexandru Dicu 10/20/2016
这只是恐怖:)
0赞 Владимiръ 11/25/2020
这不会验证具有 1 个字符域的电子邮件。即:[email protected]
0赞 David Silva Smith 11/25/2020
你@Владимiръ运行代码的?上次有人说它不起作用时,我启动了一个编码环境,它确实正确验证了。我已经有大约 8 年没有使用 C# 了,我真的很好奇你是否知道它不起作用,或者你是否正在阅读代码并说它不起作用。
313赞 imjosh 5/7/2013 #9

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

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

using System.ComponentModel.DataAnnotations;

class ValidateSomeEmails
{
    static void Main(string[] args)
    {
        var email = new EmailAddressAttribute();
        email.IsValid("[email protected]");         //true
        email.IsValid("[email protected]");       //true
        email.IsValid("[email protected]");     //true
        email.IsValid("[email protected]");      //true
        
        email.IsValid("fdsa");                          //false
        email.IsValid("fdsa@");                         //false
        email.IsValid("fdsa@fdsa");                     //false
        email.IsValid("fdsa@fdsa.");                    //false

        //one-liner
        if (new EmailAddressAttribute().IsValid("[email protected]")) 
            return true;
    }
}

评论

5赞 Casey 7/31/2014
很酷,尽管令人失望的是,MS 无法使其与他们自己的文档一致。这拒绝了 [email protected]
18赞 Aaroninus 2/5/2015
请注意,这比 - 更宽松,例如,接受 TLD 的地址。如果您需要尽可能宽容,请记住一些事情。EmailAddressAttributeSystem.Net.Mail.MailAddressMailAddress
5赞 hofnarwillie 12/16/2015
@Cogwheel:如果答案在评论中的某个地方,它可能应该添加到答案的主体中。
6赞 Cogwheel 12/16/2015
@hofnarwillie:它在正文中,但评论详细说明。如果你的目标是不激怒你的用户,那么你的验证不应该比规范更严格。真正验证电子邮件是否有效的唯一方法是发送测试邮件。
10赞 urig 6/11/2017
请注意,返回 .foo.IsValid(null);true
18赞 Poyson1 7/7/2013 #10

我认为最好的方法如下:

    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;
    }

您可以在常规类中使用此静态函数。

评论

0赞 Simone 5/23/2017
此答案不接受域部分中带有 TLD 的地址。
50赞 Chad Grant 7/18/2013 #11

.net 4.5 添加了 System.ComponentModel.DataAnnotations.EmailAddressAttribute

您可以浏览 EmailAddressAttribute 的源代码,这是它在内部使用的正则表达式:

const string pattern = @"^((([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\uFDF0-\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-\uFFEF])))\.?$";

评论

2赞 B Z 9/7/2013
不幸的是,EmaillAddressAttribute 允许 - 这不是电子邮件的有效字符
20赞 Casey 7/31/2014
@BZ 是的。你为什么不认为呢?
0赞 Nikhil Agrawal 10/5/2015
@Chad Grant:这是一个 C# 版本。你能提供一个 VB.Net 吗?因为这将转义像 \\ 到 \ 这样的字符,或者您可以逐字提供字符串。
5赞 Christopher 5/2/2017
这可行,但不要忘记,因为此模式不允许明确使用大写字母!RegexOptions.IgnoreCase
2赞 Ohad Schneider 7/15/2017
请注意,正则表达式是经过深思熟虑的:“此属性提供与 jquery validate 等效的服务器端电子邮件验证,因此共享相同的正则表达式”。
5赞 Ralph N 2/22/2014 #12

这是我的答案——Phil 的解决方案对于像“[email protected]”这样的单字母域失败。信不信由你,它被使用了 =)(例如,转到 centurylink)。

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

这是我的正则表达式。它可以很好地与 MVC 验证属性配合使用。
- @ 之前的所有内容都简化了,因此至少 javascript 可以工作。只要 Exchange 服务器不给我 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 服务器就会出现 5.1.3 运行时错误。

评论

0赞 Fattie 3/25/2014
这似乎是最好的最周到/最合理/最真实的答案,谢谢拉尔夫!
0赞 disasterkid 8/28/2015
这是迄今为止最好的答案!我不敢相信一个接受为有效电子邮件地址的糟糕解决方案已经获得了正确的答案以及所有这些赞成票。无论如何,谢谢!basket@ball
0赞 Bat_Programmer 7/16/2018
谢谢,这是最好的解决方案,应该被接受的答案。
1赞 ErwanLent 3/18/2014 #13
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);
}
1赞 Rajib Chy 6/12/2014 #14

通过以下方式检查电子邮件字符串的格式是否正确:System.Text.RegularExpressions

    public static bool IsValidEmailId(string InputEmail)
    {
        Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
        Match match = regex.Match(InputEmail);
        if (match.Success)
            return true;
        else
            return false;
    }

    protected void Email_TextChanged(object sender, EventArgs e)
    {
        String UserEmail = Email.Text;
        if (IsValidEmailId(UserEmail))
        {
            Label4.Text = "This email is correct formate";
        }
        else
        {
            Label4.Text = "This email isn't correct formate";
        }
    }
1赞 Aina Ademola C 10/22/2014 #15

/使用在 中创建“new 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;
    }
}

此外,您可以使用以下功能:

http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx

评论

0赞 Furkan Gözükara 5/26/2015
对于这封电子邮件来说,它说 true:“fuly[email protected]ö”,它会在 Mandrill API 上抛出错误
1赞 Aina Ademola C 5/29/2015
首先,电子邮件是有效的 w.r.t. [email protected] 或 [email protected] 电子邮件具有除最后一个字符“ö”之外的所有有效字符串和条件,您可以轻松地添加一个简单的条件来验证此类字符。其次,我不确定 mandrill api 错误,您可能需要验证您的使用方法,因为我在其他环境/api 上使用了此验证,并且对我很好。
85赞 Manik Arora 11/26/2015 #16

我使用这种单衬里方法为我完成工作-

using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
    return new EmailAddressAttribute().IsValid(source);
}

根据注释,如果(电子邮件地址)为 null,这将“失败”。source

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

评论

1赞 B. Clay Shannon-B. Crow Raven 2/13/2016
这对我不起作用;我得到,“'数据注释'不存在......您是否缺少程序集引用?我需要添加哪个引用?
0赞 jao 2/11/2017
如果 source 为 null,这将返回 true。如果指定的值有效或 null,请参阅 msdn.microsoft.com/en-us/library/hh192424 “true;否则,是假的。
3赞 Sebastian Hofmann 3/7/2018
更好的版本:public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
10赞 Patrik Melander 6/19/2018
甚至更好:public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
3赞 Marc.2377 5/25/2019
我不认为这个扩展方法应该静默地返回 null 字符串。这就是为什么我建议(更好更好)++ 版本:.我现在要去找到改革宗教会的更好更好的版本主义者。falsepublic static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
1赞 B. Clay Shannon-B. Crow Raven 2/13/2016 #17

我简明扼要地将 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);
}
17赞 WonderWorker 3/15/2016 #18

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

这些方法:

  • 经过试验和测试。这些方法在我自己的专业项目中使用。

  • 在内部使用正则表达式,可靠且快速。

  • 由 Microsoft 为 C# 制作。没有必要重新发明轮子。

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

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

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

System.ComponentModel.DataAnnotations

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

(new EmailAddressAttribute().IsValid("[email protected]"));

使用示例

以下是一些声明方法:

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;

}

...并代码演示它们在操作中:

List<string> Recipients = GetRecipients();

bool IsValidEmailAddresses = IsValidEmailAddresses(Recipients);

if (IsValidEmailAddresses)
{
    //Emails are valid. Your code here

}
else
{
    StringBuilder sb = new StringBuilder();

    sb.Append("The following addresses are invalid:");

    List<string> InvalidEmails = GetInvalidEmailAddresses(Recipients);

    foreach (string InvalidEmail in InvalidEmails)
    {
        sb.Append("\n" + InvalidEmail);

    }

    MessageBox.Show(sb.ToString());

}

此外,此示例:

  • 超出规范范围,因为单个字符串用于包含 0、一个或多个由分号分隔的电子邮件地址。;
  • 清楚地演示如何使用 EmailAddressAttribute 对象的 IsValid 方法。

替代方法,适用于 .Net 版本低于 4.5 的用户

对于 .Net 4.5 不可用的情况,我使用以下解决方案:

具体来说,我使用:

public static bool IsValidEmailAddress(string emailAddress)
{
    bool MethodResult = false;

    try
    {
        MailAddress m = new MailAddress(emailAddress);

        MethodResult = m.Address == emailAddress;

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

    }

    return MethodResult;

}

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 (!IsValidEmail(Recipient) && !InvalidEmailAddresses.Contains(Recipient))
            {
                InvalidEmailAddresses.Add(Recipient);

            }

        }

        MethodResult = InvalidEmailAddresses;

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

    }

    return MethodResult;

}

评论

1赞 Jan 9/18/2017
@ThomasAyoub 我还没有看到 EmailAddressAttribute 答案,也没有使用新 MailAddress() 并检查输入 == 的答案。地址,所以我认为它非常有用。如果不阅读评论,公认的答案是完全错误的。new MailAddress(“Foobar [email protected]”) 证明了这一点。
0赞 ruffin 2/28/2018
@Jan fwiw,Manik 在不到四个月的时间里击败了 Knickerless,尽管这一次确实抓住了这个问题。EmailAddressAttributenull
1赞 Amit Gorvadiya 8/22/2016 #19

识别电子邮件ID是否有效的简单方法。

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})(\]?)$");
}
2赞 aBertrand 6/29/2017 #20

一个不使用正则表达式(我不喜欢它的可读性差的简单方法):

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;
}

例子:

它旨在简单,因此它不处理极少数情况,例如包含空格(通常允许)的括号域的电子邮件、带有 IPv6 地址的电子邮件等。

2赞 SKARVA Bodavula 8/27/2017 #21
For the simple email like [email protected], 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;
        }

评论

0赞 Ray Cheng 1/26/2018
它将无法验证 [email protected] 是否为有效的电子邮件地址。
33赞 Naveen 1/27/2018 #22

简短准确的代码

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);
}

评论

0赞 Goner Doug 4/30/2019
我不得不将公共静态布尔 IsValidEmail(此字符串电子邮件)更改为公共静态布尔 IsValidEmail(字符串电子邮件)以避免此:stackoverflow.com/questions/10412233/...
0赞 Naveen 4/30/2019
@Goner Doug 来说,这个功能会像这样工作。(bool 标志 = EmailAddress.IsValidEmail())
2赞 Goner Doug 5/1/2019
需要删除“THIS”以避免在添加到我的表单时导致编译器问题。
0赞 Naveen 7/16/2019
@Goner道格,它的功能将像这样工作。字符串电子邮件 = “[email protected]”;if (电子邮件。IsValidEmail()){ 返回 false;else { return true;}
2赞 Ulysses Alves 4/25/2018 #23

如果你使用的是 FluentValidation,你可以写一些简单的东西,就像这样:

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;
3赞 rethabile 7/21/2018 #24

对@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;
  }
}

评论

0赞 Langdon 10/1/2018
这似乎无济于事...... 输出“asdf@asdf.”,这是无效的。Console.WriteLine(MailAddress("asdf@asdf.").Address);
0赞 rethabile 10/2/2018
.NET 似乎有自己的有效定义。相关讨论
4赞 Phil C 10/7/2018 #25

这里有很多强有力的答案。但是,我建议我们退后一步。@Cogwheel https://stackoverflow.com/a/1374644/388267 回答了这个问题。然而,在批量验证方案中,如果许多正在验证的电子邮件地址无效,则成本可能很高。我建议我们在进入他的 try-catch 块之前使用一些逻辑。我知道可以使用正则表达式编写以下代码,但对于新开发人员来说,理解成本可能很高。这是我的两便士值:

    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;
        }
    }

评论

0赞 Eric Mutta 10/11/2022
这将拒绝包含多个符号的有效电子邮件地址(请参阅此文章"Abc@def"@example.com@
2赞 Liakat Hossain 11/6/2018 #26

@Cogwheel中得票最多的答案是最佳答案,但是我尝试实现字符串方法,因此它将从字符串开始到结束修剪所有用户空白。查看下面的代码以获取完整示例-trim()

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

评论

0赞 Marco de Zeeuw 4/9/2019
这样做的风险是,您正在验证与源地址不同的电子邮件地址,从而使您认为您可以向指定电子邮件地址的(在本例中)未修剪的版本发送邮件。更好的方法是制作一个单独的方法,使用该方法的结果来验证并发送电子邮件。SanitizeEmail(string email)
0赞 CodeMan03 5/25/2022
A+b@b 使用此代码有效,但这不是有效的电子邮件
2赞 Filip 7/4/2019 #27

另一个正则表达式匹配答案:

   /// <summary>
   /// Validates the email input
   /// </summary>
   internal static bool ValidateEmail(string _emailAddress)
   { 

        string _regexPattern = @"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@"
                + @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\."
                + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|"
                + @"([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$";

        return (string.IsNullOrEmpty(_emailAddress) == false && System.Text.RegularExpressions.Regex.IsMatch(_emailAddress, _regexPattern))
            ? true
            : false;
    }
4赞 Corniel Nobel 10/30/2019 #28

正如许多答案中提到的,电子邮件地址的域很复杂。在这种情况下,我强烈反对使用正则表达式。那些匹配(大多数)案例的人阅读起来非常复杂,因此需要维护。此外,仍然难以支持所有案例,而且速度很慢。

Microsoft的课在这方面有所帮助,但我认为也不完美。对于开源项目,我几年前尝试过,通过使用自定义的 EmailParserEmailAddress

这在 []https://github.com/Qowaiv/Qowaiv/blob/master/src/Qowaiv/EmailAddress.cs) 中使用。EmailAddress

通过使用这种方法,您不仅可以验证电子邮件地址,还可以清除多种格式的显示名称,去掉 -prefix,并根据 IP 地址规范化域文字,并降低所有内容(请注意,本地部分正式区分大小写)。mailto:

解决方案应支持的场景(以及提到的解决方案):

[TestCase(null)]
[TestCase("")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("ab@sd@dd")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("ab@[188.120.150.10")]
[TestCase("[email protected]]")]
[TestCase("ab@[188.120.150.10].com")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected].")]
[TestCase("ab@b+de.cc")]
[TestCase("[email protected]")]
[TestCase("[email protected],")]
[TestCase("plainaddress")]
[TestCase("plain.address")]
[TestCase("@%^%#$@#$@#.com")]
[TestCase("@domain.com")]
[TestCase("Joe Smith &lt;[email protected]&gt;")]
[TestCase("email.domain.com")]
[TestCase("email@[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected].")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("email@[123.123.123.123")]
[TestCase("email@[123.123.123].123")]
[TestCase("[email protected]]")]
[TestCase("[email protected].[123.123]")]
[TestCase("email@{leftbracket.com")]
[TestCase("email@rightbracket}.com")]
[TestCase("email@p|pe.com")]
[TestCase("isis@100%.nl")]
[TestCase("email@dollar$.com")]
[TestCase("email@r&amp;d.com")]
[TestCase("email@#hash.com")]
[TestCase("email@wave~tilde.com")]
[TestCase("email@exclamation!mark.com")]
[TestCase("email@question?mark.com")]
[TestCase("email@obelix*asterisk.com")]
[TestCase("email@grave`accent.com")]
[TestCase("email@colon:colon.com")]
[TestCase("email@caret^xor.com")]
[TestCase("email@=qowaiv.com")]
[TestCase("email@plus+.com")]
[TestCase("[email protected]>")]
[TestCase("email( (nested) )@plus.com")]
[TestCase("email)mirror(@plus.com")]
[TestCase("[email protected] (not closed comment")]
[TestCase("email(with @ in comment)plus.com")]
[TestCase(@"""Joe Smith [email protected]")]
[TestCase(@"""Joe Smith' [email protected]")]
[TestCase(@"""Joe Smith""[email protected]")]
[TestCase("email@mailto:domain.com")]
[TestCase("mailto:mailto:[email protected]")]
[TestCase("Display Name <[email protected]> (after name with display)")]
[TestCase("ReDoSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")]
public void IsInvalid(string email)
{
    Assert.IsFalse(EmailAddress.IsValid(email), email);
}

[TestCase("w@com")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("ab@[120.254.254.120]")]
[TestCase("local@2001:0db8:85a3:0000:0000:8a2e:0370:7334")]
[TestCase("local@[2001:0db8:85a3:0000:0000:8a2e:0370:7334]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("email@domain")]
[TestCase("あいうえお@domain.com")]
[TestCase("local@あいうえお.com")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("email@[123.123.123.123]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("{local{name{{with{@leftbracket.com")]
[TestCase("}local}name}}with{@rightbracket.com")]
[TestCase("|local||name|with|@pipe.com")]
[TestCase("%local%%name%with%@percentage.com")]
[TestCase("[email protected]")]
[TestCase("&local&&name&with&[email protected]")]
[TestCase("#local##name#with#@hash.com")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("*local**name*with*@asterisk.com")]
[TestCase("`local``name`with`@grave-accent.com")]
[TestCase("^local^^name^with^@xor.com")]
[TestCase("[email protected]")]
[TestCase("[email protected]")]
[TestCase("Joe Smith <[email protected]>")]
[TestCase("[email protected] (joe Smith)")]
[TestCase(@"""Joe Smith"" [email protected]")]
[TestCase(@"""Joe\\tSmith"" [email protected]")]
[TestCase(@"""Joe\""Smith"" [email protected]")]
[TestCase(@"Test |<gaaf <[email protected]>")]
[TestCase("MailTo:[email protected]")]
[TestCase("mailto:[email protected]")]
[TestCase("Joe Smith <mailto:[email protected]>")]
[TestCase("Joe Smith <mailto:email(with comment)@domain.com>")]
[TestCase(@"""With extra < within quotes"" Display Name<[email protected]>")]
[TestCase("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")]
public void IsValid(string email)
{
    Assert.IsTrue(EmailAddress.IsValid(email), email);
}
7赞 Manuel Fuchs 7/9/2020 #29

我只想指出,最近在 .NET 文档中添加了有关电子邮件验证的内容,也使用了正则表达式操作。 可以在那里找到对其实施的详尽解释。

https://learn.microsoft.com/en-us/dotnet/standard/base-types/how-to-verify-that-strings-are-in-valid-email-format

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

//       Valid: [email protected]
//       Valid: [email protected]
//       Valid: [email protected]
//       Invalid: [email protected]
//       Valid: [email protected]
//       Valid: js#[email protected]
//       Valid: j_9@[129.126.118.1]
//       Invalid: [email protected]
//       Invalid: js*@proseware.com
//       Invalid: [email protected]
//       Valid: [email protected]
//       Valid: [email protected]
//       Valid: "j\"s\""@proseware.com
//       Valid: js@contoso.中国
6赞 Vas Mil 5/19/2021 #30

我总结了截至 2021 年我为自己写的这门课的所有答案:

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

    public static bool IsValidMailAddress(this string pThis) 
            => pThis is not null 
            && Regex.IsMatch(pThis, emailPattern, RegexOptions.IgnoreCase);
}

评论

0赞 Premier Bromanov 4/26/2022
适用于检测连续和引号外的多个字符,并且似乎遵循此处列出的标准:en.wikipedia.org/wiki/Email_address#Local-part 但不允许 RFC 6530 允许的国际字符。.,