#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);
}
}
}