2009-06-09 19 views
5

मैं बहुत सारे ई-मेल भेजते समय अच्छे प्रदर्शन की तलाश में हूं।SmtpClient के साथ मेल भेजने का सबसे अच्छा तरीका?

मैंने सुना है कि ऐसा करने का सही तरीका है कनेक्शन को खोलना ~ 20 ई-मेल भेजना और कनेक्शन बंद करना। और फिर बार-बार ऐसा करें। क्या यह सही है?

और SmtpClient कैसे काम करता है, क्या यह अपने जीवनकाल के लिए कनेक्शन खोलता है? (IDISposable नहीं, तो ऐसा नहीं दिखता है) या क्या यह प्रत्येक ई-मेल भेजने के लिए कनेक्शन खोलता है? या क्या यह हर समय एक कनेक्शन खुला रहता है? या क्या इसमें कुछ जादू है जो उचित होने पर कनेक्शन खोलता है और बंद करता है?

मैं जानना चाहता हूं इसलिए मुझे पता है कि मुझे SmtpClient कैसे शुरू करना चाहिए। एक सिंगलटन के रूप में या केवल संदेशों के एक हिस्से के लिए ...

उत्तर

7

यह केवल कनेक्शन से एक मेल मेल भेजता है। वास्तव में, यह कनेक्शन को ठीक से बंद भी नहीं करता है। यह मेल भेजता है, लेकिन फिर यह मेल सर्वर को नहीं बताता है कि वह छोड़ना चाहता है। इसलिए, यह केवल खुले लटकने को छोड़ देता है, जब तक अंतर्निहित पूल स्ट्रीम सॉकेट को बंद करने का फैसला नहीं करती है।

... 
     this.GetConnection(); 
     fileMailWriter = this.transport.SendMail((message.Sender != null) ? message.Sender : message.From, recipients, message.BuildDeliveryStatusNotificationString(), out exception); 
     } 
     catch (Exception exception2) 
     { 
      if (Logging.On) 
      { 
       Logging.Exception(Logging.Web, this, "Send", exception2); 
      } 
      if ((exception2 is SmtpFailedRecipientException) && !((SmtpFailedRecipientException) exception2).fatal) 
      { 
       throw; 
      } 
      this.Abort(); 
      if (this.timedOut) 
      { 
       throw new SmtpException(SR.GetString("net_timeout")); 
      } 
      if (((exception2 is SecurityException) || (exception2 is AuthenticationException)) || (exception2 is SmtpException)) 
      { 
       throw; 
      } 
      throw new SmtpException(SR.GetString("SmtpSendMailFailure"), exception2); 
     } 

btw, अधिक जानकारी SmtpClient जारी करने के आदेश QUIT नहीं के बारे में है:

यहाँ परावर्तक से आंतरिक कोड है। https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711&wa=wsignin1.0

संपादित करें: web.archive.org

पर मृत ऊपर दिया गया लिंक देखें काम के आसपास 1. इस के लिए SmtpClient.ServicePoint.MaxTimeout स्थापित करने के लिए तेजी से सॉकेट बंद हो जाएगा है, तथापि, यह वास्तव में जारी नहीं करता है QUIT कमांड।

+0

क्या 'QUIT' के साथ समस्या को नए .NET ढांचे में तय किया गया है? – jocull

+0

यह माना जाता है कि .NET 4.0 https://stackoverflow.com/questions/1466572/net-system-net-mail-smtpclient-class-doesnt-issue-quit-command-to-smtp-transac?noredirect=1 में तय किया गया था # comment79406662_1466572 – jocull

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

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