了解SmtpClient如何处理重试

时间:2011-04-14 16:25:40

标签: asp.net gmail smtpclient

我正在使用GoogleApps帐户从我的(mvc)网络应用程序发送事件通知。通常一切正常。当系统被要求发送超过75条消息时,我看到来自SMTP服务器的回复:

  

服务不可用,关闭   传输通道。服务器   回复是:4.7.0稍后再试,   关闭连接。 (邮件)   uf10sm1153163icb.17

然而,系统是自动重试的,并且我的系统最终要求发送的任何内容(通过我可以告诉的所有内容)将其发送出去。但考虑到代码生成和发送电子邮件的方式,我不明白如何处理这些重试。

我想尝试减慢传输速度,希望如果提交的内容异步发生,那么导致“服务不可用”状态的任何内容都会被安抚。但是从代码的外观来看,它已经是因为我正在使用Try |抓住了。

这是我的门面代码的相关部分:

foreach (string email in recipientEmails)
{
    try
    {
        EmailGateway.Instance.SendEmail(email, notificationSubject, notificationMessage);
   }
    catch (Exception ex)
    {
        Logger.Instance.LogException(ex);
        Logger.Instance.LogMessage("ERROR! Unsent email is to: " + email );
    }
    Logger.Instance.LogMessage("Sent " + notificationSubject + " to " + email);
}

这是网关代码(使用System.Net.Mail;):

public virtual void SendEmail(string replyToAddress, string toEmailAddress, string subject, string body)
{
    string destinationEmailAddress = toEmailAddress;
    string fromEmailAddress = "my@address.com";
    bool useSSL = "true";

    MailMessage message = new MailMessage(fromEmailAddress, destinationEmailAddress, subject, body);
    message.IsBodyHtml = true;

    SmtpClient smtp = new SmtpClient();
    smtp.EnableSsl = useSSL;

    smtp.Send(message);
}

所以我抓住了两次成功并且进入了我的记录器表。我不明白的是我如何看到两者的失败的日志消息,然后是同一电子邮件地址的成功条件。这表示'重试',虽然我并不感到惊讶,SmtpClient(原生.net程序集)可以在没有明确代码要求的情况下重试,但我没有看到我的外观代码是如何记录这两个条件的。

1 个答案:

答案 0 :(得分:4)

SmtpClient未重试发送电子邮件。
在您的外观代码中,无论您是否获得例外,您总是会记录成功 您应该在try块中记录成功,否则您将捕获异常(记录失败),从catch块中取出并记录成功,这正是您所观察到的。

foreach (string email in recipientEmails)
{
    try
    {
        EmailGateway.Instance.SendEmail(email, notificationSubject, notificationMessage);
        Logger.Instance.LogMessage("Sent " + notificationSubject + " to " + email);

   }
    catch (Exception ex)
    {
        Logger.Instance.LogException(ex);
        Logger.Instance.LogMessage("ERROR! Unsent email is to: " + email );
    }
}