2009-06-09 5 views
5

多くの電子メールを送信するときに、優れたパフォーマンスを探しています。SmtpClientでメールを送る最適な方法は?

私はそれを行う正しい方法は、接続を開いて20通の電子メールを送信し、接続を閉じることだと聞いています。それを何度も何度もやり直してください。 これが正しいですか?

SmtpClientはどのように機能しますか、それは自分自身のために接続を開きますか? (IDisposableではないので、そのようには見えません) または、送信される各電子メールに対して接続を開きますか? いつも開いているのですか? それは適切なときに接続を開閉する魔法を持っていますか?

私はSmtpClientをどのように開始すべきか知っています。シングルトンとして、またはメッセージの塊のためだけに...

答えて

7

これは、接続から1つのMailMessageを送信するだけです。実際には、接続を適切に閉じることさえできません。メールを送信しますが、終了したいメールサーバーには通知しません。したがって、プールされたストリームがソケットを閉じることを決定するまで、開いたままにしておきます。ここで

はリフレクタからの内部コードです:

... 
     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); 
     } 

ところで、ここでQUITコマンドを発行していないSmtpClientについての詳細情報です。 https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711&wa=wsignin1.0

編集:回避策は、これが速くソケットをクローズします。1.にSmtpClient.ServicePoint.MaxTimeoutを設定することですweb.archive.org

に上記のリンク切れを見る、しかし、これは実際には発行しません。 QUITコマンド。

+0

新しい.NET Frameworkでは 'QUIT'の問題は修正されましたか? – 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

関連する問題