Цикл для повторной отправки электронной почты smtp при сбое отправки

#c# #email #smtpclient

#c# #Адрес электронной почты #smtpclient

Вопрос:

У меня есть служба, которая отправляет электронное письмо после регистрации пользователя. Время от времени пользователь обращается в службу поддержки с жалобой на то, что он не получает электронное письмо, поэтому я составил список возможных проблем, одной из которых является сбой smtp при отправке электронной почты, который я иногда замечал, когда просматривал код. Я хочу написать простой цикл, который пытается повторно отправить электронное письмо пару раз при неудачной отправке, но я не уверен, как это сделать. Я был бы признателен за любой совет по этому вопросу.

 public void MusicDownloadEmail(string email)
    {
        try
        {
            var smtp = new SmtpClient();
            var mail = new MailMessage();
            const string mailBody = "Body text";
            mail.To.Add(email);
            mail.Subject = "Mail subject";
            mail.Body = mailBody;
            mail.IsBodyHtml = true;
            smtp.Send(mail);
        }
        catch (Exception ex)
        {                
            var exception = ex.Message.ToString();
            //Other code for saving exception message to a log.
        }
    }
 

Комментарии:

1. Итак, вы получаете исключение?

2. Да, в редких случаях я получаю ошибку «сбой при отправке электронной почты».

Ответ №1:

Что-то вроде этого должно сработать:

 public void MusicDownloadEmail(string email)
{
    int tryAgain = 10;
    bool failed = false;
    do
    {
        try
        {
            failed = false;

            var smtp = new SmtpClient();
            var mail = new MailMessage();
            const string mailBody = "Body text";
            mail.To.Add(email);
            mail.Subject = "Mail subject";
            mail.Body = mailBody;
            mail.IsBodyHtml = true;
            smtp.Send(mail);
        }
        catch (Exception ex) // I would avoid catching all exceptions equally, but ymmv
        {                
            failed = true;
            tryAgain--;
            var exception = ex.Message.ToString();
            //Other code for saving exception message to a log.
        }
    }while(failed  amp;amp; tryAgain !=0)
}
 

Комментарии:

1. код можно изменить, чтобы повторить только smtp.Send(mail); инструкцию.

Ответ №2:

Вы могли бы сделать это повторно

Сначала определите максимальное количество попыток

 public const int MAX_RETRY_COUNT = 3;
 

Затем вызовите метод, используя счетчик повторных попыток

 MusicDownloadEmail("code@mail.com", MAX_RETRY_COUNT);
 

И измените метод следующим образом

 public static void MusicDownloadEmail(string email, int retryCountsLeft) {
        if (retryCountsLeft > 1) {
            try {
                var smtp = new SmtpClient();
                var mail = new MailMessage();
                const string mailBody = "Body text";
                mail.To.Add(email);
                mail.Subject = "Mail subject";
                mail.Body = mailBody;
                mail.IsBodyHtml = true;
                smtp.Send(mail);

            } catch (Exception ex) {
                var exception = ex.Message.ToString();
                //Other code for saving exception message to a log.

                MusicDownloadEmail(email, --retryCountsLeft);
            }
        }
    }