2010-03-11 10 views
6

मुझे मेल भेजने से पहले SmtpClient उदाहरण में उपयोगकर्ता नाम और पासवर्ड सेट को सत्यापित करने की आवश्यकता है। इस कोड का उपयोग करना:मेल भेजने से पहले smtp क्रेडेंशियल्स को कैसे सत्यापित करें?

SmtpClient client = new SmtpClient(host); 
client.Credentials = new NetworkCredential(username,password); 
client.UseDefaultCredentials = false; 

// Here I need to verify the credentials(i.e. username and password) 
client.Send(mail); 

मैं कैसे मान्य कर सकते हैं उपयोगकर्ता प्रमाणिकता से पहचान कनेक्ट करने और एक मेल भेजने की अनुमति है या नहीं?

उत्तर

3

कोई रास्ता नहीं है।

SMTpClient मूल रूप से उपयोगकर्ता सेवा से कनेक्ट किए बिना सेवा से संपर्क किए बिना उपयोगकर्ता नाम को मान्य नहीं कर सकता है।

क्या आप कर सकते हैं यह सर्वर से एक टीसीपी कनेक्शन खोलकर SmtpClient के बाहर कर सकता है ... लेकिन प्रमाणीकरण जटिल हो सकता है कि सर्वर कैसे कॉन्फ़िगर किया गया है।

क्या मैं पूछ सकता हूं कि आपको भेजने से पहले आपको क्यों पता होना चाहिए? सामान्य व्यवहार आईएमएचओ यहां अपवादों को पकड़ने के लिए उचित त्रुटि प्रबंधन में भेजने को लपेटना होगा।

+0

मैं जानना चाहता मान्य किया जा सकता है अगर जरूरत है। जैसा कि एमएस दृष्टिकोण में होता है कि मेल भेजने से पहले, यह गलत होने पर उपयोगकर्ता नाम और पासवर्ड मांगता है। मैं अपने आवेदन में ऐसा करना चाहता था। मैं आपकी मदद की सराहना करता हूं। –

+0

दरअसल आपको कुछ गड़बड़ मिलती है। ईमेल भेजने से पहले एमएस आउटलुक आपको नहीं पूछता है।यह आपको केवल 1 ऑश्योरेंस में पूछता है: यह प्रमाणीकृत नहीं कर सकता है। यदि आप पासॉर्ड सेट करते हैं तो यह कोशिश करता है। यह पूछ सकता है कि आपने ऐसा करने के लिए इसे कॉन्फ़िगर किया है या नहीं। लेकिन संदेह में पासवर्ड के बिना कोशिश करना पूरी तरह से खुश है। – TomTom

1

पहले मान्य करना, मेल भेजना .NET 2.0 में SMTP क्लाइंट क्लास के साथ संभव नहीं है।

बंदरगाह खोलकर हाथ से मान्य करने का प्रयास करना आपके स्वयं के एसएमटीपी ग्राहक को लिखना उतना ही अच्छा है, यह जटिल है।

1

.Net's SmtpClient आपको संदेश भेजने के बिना लॉगिन करने की अनुमति नहीं देता है।

आप कुछ मौजूदा पते पर एक टेस्ट संदेश भेजकर प्रमाण पत्र देख सकते हैं जो आने वाले ईमेल को अनदेखा करते हैं और यह जांचते हैं कि आपको अपवाद मिलता है या नहीं।

ध्यान दें कि इन परीक्षण ईमेल, अपने खाते के लिए भेजा फ़ोल्डर में दिखाई देगा, यदि कोई हो (उदाहरण के लिए, जीमेल)

0

मैं पिछले जवाब से सहमत हैं, कि SmtpClient भेजे बिना मान्य नहीं कर सकता।

लेकिन शायद आपकी समस्या को हल किया जा सकता है: यदि उपयोगकर्ता नाम या पासवर्ड गलत हैं, तो client.Send(mail); एक अपवाद फेंक देगा। आप एक लेट-लूप और भेजने के चारों ओर एक कोशिश-पकड़-ब्लॉक बना सकते हैं, अपवाद पकड़ सकते हैं और उपयोगकर्ता को सही उपयोगकर्ता नाम और पासवर्ड के लिए पूछ सकते हैं, फिर पुन: प्रयास करें। यदि उपयोगकर्ता संवाद पर रद्द हो जाता है या अपवाद के बिना सफल भेजता है, तो आप थोड़ी देर के बाहर निकलें।

1

इस प्रयास करें:

try 
{ 
    smtpClient.Send(new MailMessage("[email protected]", "[email protected]", "test", "test")); 
    return string.Empty; 
} 
catch (SmtpFailedRecipientException) 
{ 
    return string.Empty; 
} 
catch (Exception ex) 
{ 
    return string.Format("SMTP server connection test failed: {0}", ex.InnerException != null ? ex.InnerException.Message : ex.Message); 
} 

यह मेरी मान्यता विधि में मेरे लिए काम करता है। लेकिन अगर आपको केवल ईमेल भेजने पर प्रमाण-पत्रों की जांच करने की आवश्यकता है, तो बस कोशिश करने के साथ अपने भेजने को घेर लें ... पकड़ो। उपयोगकर्ता नाम और मेल भेजने से पहले पासवर्ड सत्यापन के लिए

+0

Test.com एक वास्तविक डोमेन है। मैंने यह जांच नहीं की कि उसके पास एक एमएक्स रिकॉर्ड है लेकिन कोई भी जो आपके कोड स्निपेट की प्रतिलिपि बनाता है, वह मेल मेल सर्वर को test.com पर वास्तविक ईमेल भेजने का प्रयास कर सकता है। मैं अनुशंसा करता हूं कि आप अपने उदाहरण को ऐसे डोमेन नाम से संपादित करें जो वास्तव में मौजूद नहीं है (और संभवतः कभी मौजूद नहीं होगा)। – Christoph

2

मेरे उत्पादन कोड: एक similar question के जवाब में

public static bool ValidateCredentials(string login, string password, string server, int port, bool enableSsl) { 
     SmtpConnectorBase connector; 
     if (enableSsl) { 
      connector = new SmtpConnectorWithSsl(server, port); 
     } else { 
      connector = new SmtpConnectorWithoutSsl(server, port); 
     } 

     if (!connector.CheckResponse(220)) { 
      return false; 
     } 

     connector.SendData($"HELO {Dns.GetHostName()}{SmtpConnectorBase.EOF}"); 
     if (!connector.CheckResponse(250)) { 
      return false; 
     } 

     connector.SendData($"AUTH LOGIN{SmtpConnectorBase.EOF}"); 
     if (!connector.CheckResponse(334)) { 
      return false; 
     } 

     connector.SendData(Convert.ToBase64String(Encoding.UTF8.GetBytes($"{login}")) + SmtpConnectorBase.EOF); 
     if (!connector.CheckResponse(334)) { 
      return false; 
     } 

     connector.SendData(Convert.ToBase64String(Encoding.UTF8.GetBytes($"{password}")) + SmtpConnectorBase.EOF); 
     if (!connector.CheckResponse(235)) { 
      return false; 
     } 

     return true; 
    } 

अधिक जानकारी।

Code on github

+0

अब मैं lib MimeKit का उपयोग कर रहा हूं। किसी भी प्रकार के लेख के साथ काम करें। और मेरे उत्पादन में ठीक काम करता है। http://www.mimekit.net/ –

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