Понимание того, как SmtpClient обрабатывает попытки - PullRequest
0 голосов
/ 14 апреля 2011

Я работаю с аккаунтом GoogleApps для отправки уведомлений о событиях из моего (mvc) веб-приложения.Обычно все отлично работает.Когда системе предлагается отправить более 75 сообщений или около того, я вижу ответы от SMTP-сервера:

Услуга недоступна, закрытие канала передачи.Ответ сервера был: 4.7.0 Попробуйте позже, закрыв соединение.(MAIL) uf10sm1153163icb.17

Тем не менее, система автоматически повторяет попытку, и все, что моя система просит, в конечном итоге отправить (всем, что я могу сказать как этот пункт), разобрано.Но, учитывая, как код генерирует и отправляет электронные письма, я не понимаю, как обрабатываются эти повторные попытки.

Я хотел бы попытаться замедлить передачу в надежде, что что-то, что вызывает «Сервис недоступен»условие будет умиротворено, если представления происходят асинхронно.Но, судя по всему, это уже так, поскольку я использую Try |блок catch.

Вот соответствующий бит моего кода фасада:

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 Ответ

4 голосов
/ 14 апреля 2011

SmtpClient не пытается отправить электронное письмо.
В своем коде фасада вы всегда регистрируете успех, независимо от того, получаете ли вы исключение или нет.
Вы должны регистрировать успех в блоке tryиначе вы перехватываете исключение (ошибка регистрации), выходите из блока перехвата и в любом случае регистрируете успех, что вы и наблюдаете.

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 );
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...