2011-08-11 21 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

आप एक decompiler का उपयोग कर क्या 'MailAddress' का उपयोग करता है देखने के लिए कोशिश की? – Oded

+1

@ ओडेड: मेरे पास है। यह 'MailBnfHelper' नामक एक बड़ी आंतरिक कक्षा का उपयोग करता है, जो नेट 4.0 में काफी हद तक बदल गया है। मैं इसे निकालने की सिफारिश नहीं करता हूं। – SLaks

+0

नेट फ्रेमवर्क के विभिन्न संस्करणों का समर्थन करने के लिए अलग-अलग नियमों का उपयोग किया जाता है, इसलिए मुझे चिंता होगी कि कोई भी रेगेक्स: जो आप बनाते हैं वह भविष्य का सबूत नहीं हो सकता है। 'कोशिश करें' भविष्य का प्रमाण होगा हालांकि मैं एसएलएक्स के उत्तर से सहमत हूं। अन्यथा यदि आप वास्तव में एक रेगेक्स लिखना चाहते हैं, तो [MailAddress] के लिए प्रलेखन (http://msdn.microsoft.com/en-us/library/system.net.mail.mailaddress.aspx) आपके द्वारा उपयोग किए जाने वाले नियमों का वर्णन करता है ताकि आप एक प्रारंभिक बिंदु के रूप में उपयोग करने में सक्षम हो सकता है। –

उत्तर

25

दुर्भाग्यवश, MailAddress.TryParse विधि नहीं है।

आपका कोड .NET में ईमेल पते को सत्यापित करने का आदर्श तरीका है।

+2

मैं इससे असहमत हूं, मैं कोशिश करता हूं कि एक कोशिश/पकड़ ब्लॉक पर एक नियमित अभिव्यक्ति का उपयोग करें क्योंकि वे आम तौर पर धीमे होते हैं। – Cromat

+8

@ क्रोमैट - क्योंकि रेगेक्स तेजी से होने के लिए जाना जाता है, है ना? – Oded

+0

@ क्रोमैट: गलत। Regexes भी धीमी हैं, और किसी भी regex जटिल _approximate_ करने के लिए पर्याप्त एक ईमेल पता _very_ धीमा होगा। साथ ही, 'पकड़' ब्लॉक केवल तभी धीमा होते हैं जब एक अपवाद वास्तव में पकड़ा जाता है, इसलिए यह मान्य पते के सामान्य मामले में कुछ भी धीमा नहीं करेगा। – SLaks

0

कुछ वर्ण कुछ सेवा प्रदाताओं में मान्य हैं लेकिन यह दूसरों में नहीं है! SmtpClient सेवा प्रदाताओं के बारे में कुछ भी नहीं पता। तो इसे कम से कम संभव फ़िल्टर करना होगा। Wikipedia स्टैंडर्स के बारे में स्वागत है।

MailAddress का सत्यापन MSDN पर उल्लिखित है। इसलिए मुझे लगता है कि आप MailAddress आरंभ करने से पहले उन मान्यताओं की जांच कर सकते हैं।

6

यदि आपको यह सुनिश्चित करना है कि एक दिया गया ईमेल पता आईईटीएफ मानकों के अनुसार मान्य है - MailAddress वर्ग इस लेखन के समय केवल आंशिक रूप से पालन करता है - मेरा सुझाव है कि आप ईमेल सत्यापित करें। नेट, एक .NET घटक जो आप आसानी से अपने समाधान में एकीकृत कर सकते हैं। यह अपनी नौकरी करने के लिए नियमित अभिव्यक्तियों पर निर्भर नहीं है लेकिन यह एक आंतरिक परिमित राज्य मशीन पर निर्भर करता है, इसलिए यह बहुत तेज़ है।

अस्वीकरण: मैं इस घटक के नेतृत्व डेवलपर हूँ।

+0

यह सुंदर है! –

+2

यह घटक एक मुफ्त घटक नहीं है - यह $ 50.00 के लिए बेचता है। – bgmCoder

1

वास्तव में इस प्रश्न का उत्तर नहीं है, लेकिन यदि किसी को इसकी आवश्यकता है, तो मैंने इस विधि का उपयोग करके ईमेल पते को सत्यापित करने के लिए एक सी # फ़ंक्शन लिखा था।

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; 

}

संबंधित मुद्दे