私のウェブサイトからニュースレターを送信するためのシステムを構築しようとしています。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);
を実行する場合、私は...
ええ、メールはsmtpサーバー上でキューに入れられ、プログラムが終了する前に例外がスローされる可能性があります。私はいくつかのアドレスでテストを試みましたが、すべてのメールが送られましたが、すべてのログラインが書き込まれていませんでした。 – Jesper
ログラインがすべて書き込まれていないことがわかりません。「Sent mail to:」ログラインが実行されない唯一の方法は、例外がスローされてからメールを送信しない場合です。おそらく複数のスレッドを使用していますが、WriteLogメソッドでエラーが発生していますか?ファイルの代わりにコンソール/デバッグに書き出し、それがすべてのメールを出力するかどうか確認してください。 –
メインメソッドの最後にConsole.ReadLine()を追加し、そこに座って待ってください。すべての行が書き込まれます。もしそうでなければ、メールが送信されても、最後のログの一部が書き込まれていないように思えます...それが問題です。 – Jesper