2011-08-11 246 views
25

目前,以避免被抛起来的错误是由于无效的电子邮件地址,我做了以下内容:检查电子邮件地址是有效的System.Net.Mail.MailAddress

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

然而,而不是依赖Try..Catch,有没有验证电子邮件地址对MailAddress类型100%有效的方法?

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

+0

你有没有尝试使用反编译器,看看有什么'MailAddress'使用? – Oded

+1

@Oded:我有。它使用一个叫做MailBnfHelper的大型内部类,它在.Net 4.0中发生了很大的变化。我不建议提取它。 – SLaks

+0

.Net框架的不同版本使用不同的规则来支持它,所以我会担心你创建的任何正则表达式可能不是未来的证明。虽然我同意SLaks的答案,但是“Try Catch”将会是未来的证明。否则,如果你真的想写一个正则表达式,[MailAddress](http://msdn.microsoft.com/en-us/library/system.net.mail.mailaddress.aspx)的文档描述了它使用的规则,所以你可能能够以此为起点。 –

回答

25

不幸的是,没有MailAddress.TryParse方法。

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

+2

我不同意这一点,我会假设在try/catch块上使用正则表达式,因为这些通常很慢。 – Cromat

+8

@Cromat - 因为RegEx以快速而闻名,对吧? – Oded

+0

@Cromat:错了。正则表达式也很慢,并且任何足够大的正则表达式复合到_approximate_一个电子邮件地址将会很慢。而且,如果实际上捕获到异常,'catch'模块只会很慢,所以在有效地址的常见情况下,这不会减慢速度。 – SLaks

0

某些字符在某些服务提供商中是有效的,但其他字符不在其他位置! SmtpClient对服务提供商一无所知。所以它必须尽可能少地过滤。 Wikipedia关于standers被提及。

验证MailAddressMSDN上提及。因此,我认为您可以在初始化MailAddress之前检查这些验证。

6

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

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

+0

太美了! –

+2

此组件不是免费组件 - 售价为50.00美元。 – bgmCoder

1

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

FixEmailAddress("[email protected]")

回报"[email protected]"

FixEmailAddress("[email protected]@xyz.com,[email protected],asdfdsf,[email protected]")

回报"[email protected],[email protected]"

我处理电子邮件地址列表这种方式,因为用逗号分隔的电子邮件列表是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; 

}

相关问题