检查电子邮件地址是不是对 System.Net.Mail.MailAddress 有效

Posted

技术标签:

【中文标题】检查电子邮件地址是不是对 System.Net.Mail.MailAddress 有效【英文标题】:Check that email address is valid for System.Net.Mail.MailAddress检查电子邮件地址是否对 System.Net.Mail.MailAddress 有效 【发布时间】:2011-10-25 01:37:12 【问题描述】:

目前,为了避免由于无效的电子邮件地址而引发错误,我执行以下操作:

Dim mailAddress As MailAddress
Try
   mailAddress = New MailAddress("testing@invalid@email.com")
Catch ex As Exception
   'Invalid email
End Try

但是,有没有一种方法可以验证电子邮件地址对于MailAddress 类型是否 100% 有效,而不是依赖于 Try..Catch

我知道有很多用于验证电子邮件的正则表达式函数,但我正在寻找 MailAddress 类型用来验证其地址的函数。

【问题讨论】:

您是否尝试使用反编译器查看MailAddress 的用途? @Oded:我有。它使用一个名为MailBnfHelper 的大型内部类,它在.Net 4.0 中发生了很大变化。我不建议提取它。 .Net 框架的不同版本对其支持的内容使用不同的规则,因此我担心您创建的任何正则表达式:s 可能不会成为未来的证明。 Try Catch 将是未来的证明,所以我同意 SLaks 的回答。否则,如果您真的想编写正则表达式,MailAddress 的文档描述了它使用的规则,因此您可以将其用作起点。 @ho:你不能使用正则表达式。电子邮件地址不构成常规语言。 @Curt:通常,这不是一个好的做法,但在这里,这是最好的选择。 【参考方案1】:

很遗憾,没有MailAddress.TryParse 方法。

您的代码是在 .Net 中验证电子邮件地址的理想方式。

【讨论】:

我不同意这一点,我认为在 try/catch 块上使用正则表达式,因为它们通常很慢。 @Cromat:错了。正则表达式也很慢,任何复杂到近似电子邮件地址的正则表达式都会非常慢。此外,catch 块只有在实际捕获到异常时才会变慢,因此在有效地址的常见情况下这不会减慢任何速度。 @Oded 不,它们并不是最快的,但是使用异常来控制应用程序流从来都不是一个好习惯。 @Cromat:确实如此,但这是正确的做法(除了要求微软添加TryParse 方法)。它应该包装在一个返回布尔值或可为空的MailAddress 的方法中。 @Cromat - 正确,一个不应该使用异常来控制流。但也需要知道什么时候对这条规则做出例外(没有双关语)。【参考方案2】:

如果您需要根据 IETF 标准确保给定的电子邮件地址是有效的 - 在撰写本文时,MailAddress 类似乎只是部分遵循 - 我建议您看看 EmailVerify.NET,一个可以轻松集成到解决方案中的 .NET 组件。它不依赖于正则表达式来执行它的工作,而是依赖于一个内部的有限状态机,所以它非常非常快。

Website Online demo

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

【讨论】:

此组件不是免费组件 - 它的售价为 50.00 美元。 无法通过 NuGet 获得...这通常是一个危险信号。并且不必支付 $ 来验证电子邮件地址。【参考方案3】:

最近 .NET API 使用 MailAddress.TryCreate 方法进行了扩展,可能会在未来的版本中推出,这将消除对常见 try-catch 样板的需求: https://github.com/dotnet/runtime/commit/aea45f4e75d1cdbbfc60daae782d1cfeb700be02

【讨论】:

【参考方案4】:

本身并不是这个问题的真正答案,但如果有人需要,我编写了一个 C# 函数,用于使用此方法验证电子邮件地址。

FixEmailAddress("walter@xyz.com")

返回"walter@xyz.com"

FixEmailAddress("wa@lter@xyz.com,tom@xyz.com,asdfdsf,vsav-sdfsd@xyz.xyz")

返回"tom@xyz.com,vsav-sdfsd@xyz.xyz"

我以这种方式处理电子邮件地址列表,因为逗号分隔的电子邮件列表是 MailAddressCollection.Add() 的有效参数

/// <summary>
/// Given a single email address, return the email address if it is valid, or empty string if invalid.
/// or given a comma delimited list of email addresses, return the a comma list of valid email addresses from the original list.
/// </summary>
/// <param name="emailAddess"></param>
/// <returns>Validated email address(es)</returns>  
public static string FixEmailAddress(string emailAddress)


   string result = "";

    emailAddress = emailAddress.Replace(";",",");
   if (emailAddress.Contains(","))
   
       List<string> results = new List<string>();
       string[] emailAddresses = emailAddress.Split(new char[]  ',' );
       foreach (string e in emailAddresses)
       
           string temp = FixEmailAddress(e);
           if (temp != "")
           
               results.Add(temp);
           
       
       result = string.Join(",", results);
   
   else
   

       try
       
           System.Net.Mail.MailAddress email = new System.Net.Mail.MailAddress(emailAddress);
           result = email.Address;
       
       catch (Exception)
       
           result = "";
       

   

   return result;

【讨论】:

【参考方案5】:

MS 还提供了基于正则表达式的电子邮件验证器的代码: https://msdn.microsoft.com/en-us/library/01escwtf%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

【讨论】:

【参考方案6】:

某些字符在某些服务提供商中有效,但在其他服务提供商中无效! SmtpClient 对服务提供商一无所知。所以它必须尽可能少地过滤。 Wikipedia 被很好地提到了standers。

MailAddress 的验证在 MSDN 中提到。因此,我认为您可以在初始化 MailAddress 之前检查这些验证。

【讨论】:

以上是关于检查电子邮件地址是不是对 System.Net.Mail.MailAddress 有效的主要内容,如果未能解决你的问题,请参考以下文章

如何检查邮件地址是不是存在?

检查电子邮件地址是不是存在

检查字符串是不是包含电子邮件地址?

检查电子邮件地址是不是存在[重复]

如何使用 PHP 检查电子邮件地址是不是真实或有效

使用电子邮件地址检查 PayPal 帐户是不是存在?