如何通过SmtpClient C#获取邮件发送的事件#

时间:2012-01-09 11:51:37

标签: c# .net-4.0 smtpclient

我正在尝试建立一个从我的网站发送简讯的系统。

我正在构建它作为控制台应用程序,然后我将每天从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();
}

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

3 个答案:

答案 0 :(得分:1)

如果你执行不是异步的行client.Send(mail);并且它没有抛出异常,则意味着邮件已被发送。

无论是否发送,您都无法看到由smtp服务器处理的内容,据我所知,SmtpClient不支持该事件。

答案 1 :(得分:0)

SmtpClient sc = new SmtpClient();

sc.SendCompleted + = new SendCompletedEventHandler(SendAsyncCallback);

答案 2 :(得分:0)

您的代码本身就是这样做的。如果WriteLog()写入Sent Email to...,则表示邮件已被发送,而不是。