我如何得到邮件通过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不支持该事件。
答
SmtpClient sc = new SmtpClient();
sc.SendCompleted + = new SendCompletedEventHandler(SendAsyncCallback);
答
你的代码现在正在这么做。如果WriteLog()
确实写入Sent Email to...
,则意味着邮件已经被发送。
是的,但邮件将排队在smtp服务器上,程序结束之前可能会抛出任何异常,因为例外被延迟。我试着用几个地址进行测试,并发送了所有的邮件,但并不是所有的日志文件都被写入了。 – Jesper 2012-01-09 12:02:51
我无法看到所有的日志行是如何写入的,原因是“发送邮件到:”日志行不会执行的唯一方式是如果抛出异常并且不应该发送邮件。您是否正在使用多个线程,并且在WriteLog方法中发生错误?尝试将其写入控制台/调试而不是文件,并查看是否输出所有邮件。 – 2012-01-09 12:15:55
如果我在主方法的末尾添加Console.ReadLine(),并让它坐在那里等待。所有行都写入。如果没有,即使邮件被发送,似乎最后一些日志也没有被写入......这就是事实。 – Jesper 2012-01-09 12:18:14