我如何得到邮件通过SmtpClient C#发送的事件

问题描述:

我正在尝试构建一个从我的网站发送简讯的系统。我如何得到邮件通过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服务器处理的,据我所知SmtpClient不支持该事件。

+0

是的,但邮件将排队在smtp服务器上,程序结束之前可能会抛出任何异常,因为例外被延迟。我试着用几个地址进行测试,并发送了所有的邮件,但并不是所有的日志文件都被写入了。 – Jesper 2012-01-09 12:02:51

+0

我无法看到所有的日志行是如何写入的,原因是“发送邮件到:”日志行不会执行的唯一方式是如果抛出异常并且不应该发送邮件。您是否正在使用多个线程,并且在WriteLog方法中发生错误?尝试将其写入控制台/调试而不是文件,并查看是否输出所有邮件。 – 2012-01-09 12:15:55

+0

如果我在主方法的末尾添加Console.ReadLine(),并让它坐在那里等待。所有行都写入。如果没有,即使邮件被发送,似乎最后一些日志也没有被写入......这就是事实。 – Jesper 2012-01-09 12:18:14

SmtpClient sc = new SmtpClient();

sc.SendCompleted + = new SendCompletedEventHandler(SendAsyncCallback);

你的代码现在正在这么做。如果WriteLog()确实写入Sent Email to...,则意味着邮件已经被发送。