2011-08-11 188 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; 

}

相關問題