2012-01-09 14 views
0

私のウェブサイトからニュースレターを送信するためのシステムを構築しようとしています。SmtpClientによってメールが送信されたというイベントを取得する方法C#

私はそれをWindowsのスケジューラから毎日実行するコンソールアプリケーションとしてビルドしています。

私は、システム内のいくつかのログ機能を持つようにしたいので、私は最も簡単なログ「機能」を追加しています。

メールは罰金送信されますが、私はメールが送信されたときにログに書きたいと思います。問題は、メールが送信されたとき、またはメールが送信されなかったときに、SmtpClientからイベントを取得する方法がわからないことです。

public void SendMails(List<Agent> agents, string logfilename) 
{ 
    foreach (Agent agent in agents) 
    { 
     MailMessage mail = new MailMessage(); 
     mail..... 

     SmtpClient client = new SmtpClient(); 
     client..... 

     try 
     { 
      client.Send(mail); 
      WriteLog(logfilename, "Sent mail to: " + mail.To[0].Address); 
     } 
     catch (SmtpException smtpexception) 
     { 
      WriteLog(logfilename, "SMTP EXCEPTION: " + smtpexception.Message); 
     } 
     catch (Exception e) 
     { 
      WriteLog(logfilename, "EXCEPTION: " + e.Message); 
     } 
    } 
} 

public void WriteLog(string filename, string message) 
{ 
    TextWriter tw = new StreamWriter(@"c:\MailLogs\" + filename + ".txt"); 
    tw.WriteLine(message); 
    tw.Close(); 
} 

だから、どのように私は、コードを変更しますので、プログラムが実際にメールが送信されたりされなかったかを知った後、あなたがいないラインclient.Send(mail);を実行する場合、私は...

答えて

1

をログを書き込むことができます非同期で、例外をスローしません。これは、メールが送信されたことを意味します。

それが配信されるか、それがあなたのSMTPサーバーによって処理され、私の知る限りではSmtpClientが、そのためのイベントをサポートしていないとして、あなたが見ることはできませんではないかどうか。

+0

ええ、メールはsmtpサーバー上でキューに入れられ、プログラムが終了する前に例外がスローされる可能性があります。私はいくつかのアドレスでテストを試みましたが、すべてのメールが送られましたが、すべてのログラインが書き込まれていませんでした。 – Jesper

+0

ログラインがすべて書き込まれていないことがわかりません。「Sent mail to:」ログラインが実行されない唯一の方法は、例外がスローされてからメールを送信しない場合です。おそらく複数のスレッドを使用していますが、WriteLogメソッドでエラーが発生していますか?ファイルの代わりにコンソール/デバッグに書き出し、それがすべてのメールを出力するかどうか確認してください。 –

+0

メインメソッドの最後にConsole.ReadLine()を追加し、そこに座って待ってください。すべての行が書き込まれます。もしそうでなければ、メールが送信されても​​、最後のログの一部が書き込まれていないように思えます...それが問題です。 – Jesper

0

SmtpClient sc = new SmtpClient();

sc.SendCompleted + =新しいSendCompletedEventHandler(SendAsyncCallback)。

0

あなたのコードは今ではそうしています。 WriteLog()Sent Email to...と記載されている場合は、メールが送信されていないことを意味します。

関連する問題