【问题标题】:How do I get an event that a mail was sent through SmtpClient C#如何获取通过 SmtpClient C# 发送邮件的事件
【发布时间】:2012-02-05 23:05:11
【问题描述】:

我正在尝试构建一个用于从我的网站发送新闻通讯的系统。

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

那么,我要怎么改代码,让程序真正知道邮件有没有发送之后再写日志……

【问题讨论】:

    标签: c# .net-4.0 smtpclient


    【解决方案1】:

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

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

    【讨论】:

    • 是的,但是邮件将在 smtp 服务器上排队,并且由于异常被延迟,因此程序在可能引发任何异常之前结束。我尝试使用几个地址进行测试,所有邮件都已发送,但并非所有日志行都已写入。
    • 我看不到所有日志行是如何写的,原因是“发送邮件到:”日志行不会执行的唯一方法是如果抛出异常,然后不应发送邮件。您是否正在使用多个线程并且错误发生在 WriteLog 方法中?尝试将其写入控制台/调试而不是文件,看看是否输出所有邮件。
    • 如果我在 main 方法的末尾添加 Console.ReadLine() 并让它坐在那里等待。所有的行都写好了。如果没有,似乎最后的一些日志没有写入,即使发送了邮件......就是这样。
    • 我能想到的唯一原因是,如果您在 WriteLog 中使用线程?否则你的日志文件仍然是用主线程编写的,只有在所有代码执行后才会退出。不过看看你的代码,你没有使用线程,所以这很奇怪
    【解决方案2】:

    SmtpClient sc = new SmtpClient();

    sc.SendCompleted += new SendCompletedEventHandler(SendAsyncCallback);

    【讨论】:

      【解决方案3】:

      您的代码本身现在正在这样做。如果WriteLog() 确实写了Sent Email to...,则表示邮件已发送,否则未发送。

      【讨论】:

        猜你喜欢
        • 2021-06-23
        • 2019-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        • 1970-01-01
        相关资源
        最近更新 更多