C# 如何获取通过SMTPC客户端发送邮件的事件#

C# 如何获取通过SMTPC客户端发送邮件的事件#,c#,.net-4.0,smtpclient,C#,.net 4.0,Smtpclient,我试图建立一个系统,从我的网站发送新闻稿 我将它构建为一个控制台应用程序,然后每天从windows调度器执行 我想在系统中有一些日志记录,所以我添加了最简单的日志“功能” 邮件发送的很好,但我想在邮件发送时在日志中写下。问题是,我不知道如何在邮件发送或未发送时从SmtpClient获取事件 public void SendMails(List<Agent> agents, string logfilename) { foreach (Agent agent in agents

我试图建立一个系统,从我的网站发送新闻稿

我将它构建为一个控制台应用程序,然后每天从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();
}
public void SendMails(列出代理,字符串日志文件名)
{
foreach(代理中的代理)
{
MailMessage mail=新的MailMessage();
邮寄。。。。。
SmtpClient=新的SmtpClient();
客户
尝试
{
客户端。发送(邮件);
WriteLog(日志文件名,“已发送邮件至:”+mail.to[0]。地址);
}
捕获(SmtpException SmtpException)
{
WriteLog(日志文件名,“SMTP异常:”+smtpexception.Message);
}
捕获(例外e)
{
WriteLog(日志文件名,“异常:”+e.Message);
}
}
}
public void WriteLog(字符串文件名、字符串消息)
{
TextWriter tw=新的StreamWriter(@“c:\MailLogs\“+文件名+”.txt”);
tw.WriteLine(消息);
tw.Close();
}

那么,如何更改代码,以便在程序实际知道邮件是否已发送后编写日志…

如果执行行
client.Send(mail),它不是异步的,并且不会引发异常。这意味着邮件已发送


无论是否交付,您都无法看到,因为这是由smtp服务器处理的,据我所知,SmtpClient不支持该事件。

SmtpClient sc=new SmtpClient()


sc.SendCompleted+=新的SendCompletedEventHandler(SendAsyncCallback)

您的代码本身现在正在这样做。如果
WriteLog()
确实将
发送的电子邮件写入…
,则表示邮件已发送,否则不会发送

是的,但是邮件将在smtp服务器上排队,程序将在异常延迟时抛出任何异常之前结束。我尝试用几个地址进行测试,所有的邮件都被发送了,但并不是所有的日志行都被写入了。我看不出所有的日志行是如何被写入的,原因是“sent mail to:”日志行不会执行的唯一方法是如果抛出异常,那么邮件就不应该被发送。您是否正在使用多个线程,并且WriteLog方法中发生了错误?尝试将其写入console/debug而不是文件,看看是否会输出所有邮件。所有的行都写下来了。如果没有,似乎最后的一些日志没有被写入,即使邮件被发送了。。。这就是问题所在。我能想到的唯一原因是,如果你在WriteLog中使用线程?否则,日志文件仍然使用主线程写入,只有在执行所有代码后,主线程才会退出。但是看看你的代码,你没有使用线程,所以这很奇怪