Как отловить конкретные исключения при отправке почты? - PullRequest
3 голосов
/ 19 мая 2011

У меня есть следующий фрагмент кода

try
{
  if (!bDebug)
    smtp.Send(m);
}
catch (Exception e)
{
  wl("Meldingen kunne ikke sendes til en eller flere mottakere.", ConsoleColor.Red);
  wl(e.Message, ConsoleColor.DarkRed);
  using (var errorfile = System.IO.File.CreateText("error-" + DateTime.Now.Ticks + ".txt"))
  {
    errorfile.WriteLine(e.StackTrace);
    if (e.GetType() == typeof(SmtpFailedRecipientException))
    {
      var se = (SmtpFailedRecipientException) e;
      errorfile.WriteLine(se.FailedRecipient);
    }
    errorfile.WriteLine(e.ToString());
  }
}

Где wl - это ярлык для записи в консоль с цветным шрифтом, а текст в первой строке говорит: «Не удалось отправить сообщениеодин или несколько получателей.

Раньше я только ловил SmtpFailedRecipientException, но когда он начинал давать сбой в некоторых других шагах, я запихал туда общий шаблон Exception.преобразую объект Exception в более конкретный объект, чтобы получить свойство FailedRecipient. Может ли / должно ли это быть выполнено другим, более подходящим способом? Это кажется немного неуклюжим ...

Ответы [ 2 ]

8 голосов
/ 19 мая 2011

Вы можете иметь несколько ветвей catch:

catch (SmtpFailedRecipientException se)
{
  using (var errorfile = System.IO.File.CreateText("error-" + DateTime.Now.Ticks + ".txt"))
  {
    errorfile.WriteLine(se.StackTrace);  
    // variable se is already the right type, so no need to cast it      
    errorfile.WriteLine(se.FailedRecipient);       
    errorfile.WriteLine(se.ToString());
  }
}
catch (Exception e)
{
  wl("Meldingen kunne ikke sendes til en eller flere mottakere.", ConsoleColor.Red);
  wl(e.Message, ConsoleColor.DarkRed);   

  // for other error types just write the info without the FailedRecipient
  using (var errorfile = System.IO.File.CreateText("error-" + DateTime.Now.Ticks + ".txt"))
  {
    errorfile.WriteLine(e.StackTrace);        
    errorfile.WriteLine(e.ToString());
  }

}
4 голосов
/ 19 мая 2011

Вы можете попробовать что-то вроде этого ( source ):

Мы собираемся научиться ловить / обрабатывать различные типы исключения / ошибки, которые могут возникнуть при отправке электронного письма с использованием ASP.Net. Мы реализуем обработку ошибок / исключений, используя разные классы исключений доступны в System.Net.Mail.

Сначала узнайте, как отправить электронное письмо с помощью ASP.Net, посетите это ссылка . Обратите внимание, что в приведенной выше статье (по ссылке) «SendEmails» ловит только общее исключение и в случае ASP.Net возникает ошибка при отправке электронной почты, это будет похоже на «Отправка ошибка электронной почты и т. д. Мы расширим функциональность обработки ошибок для вышеуказанная статья. Итак, давайте начнем с открытия решения, которое мы создан ранее. Мы уже поставили блок try-catch, который ловит общее исключение, которое очень мало говорит о том, что могло бы пойти неправильно. Давайте сразу поймать различные типы исключений:

Поймать SmtpException: класс SmtpException имеет свойство 'StatusCode', который на самом деле является перечислением, которое получает значение кода ошибки / исключения, возвращаемое SMTP-сервером при отправке электронной почты сообщение передается. Он также предоставляет более подробную информацию о ошибка / исключение, которое может возникнуть в процессе отправки электронной почты. например

catch (SmtpException smtpException) 
{ // You can put a switch block to check for different exceptions or errors    

 // To checks if the destination mailbox is busy 
 if (smtpException.StatusCode == SmtpStatusCode.MailboxBusy) 
   throw smtpException; 

 // To check if the client is authenticated or is allowed to send email using the specified SMTP host 
 if (smtpException.StatusCode == SmtpStatusCode.ClientNotPermitted) 
   throw smtpException; 
 // The following code checks if the email message is too large to be stored in destination mailbox 

 if (smtpException.StatusCode == SmtpStatusCode.ExceededStorageAllocation) 
   throw smtpException; 
 // To check if the email was successfully sent to the SMTP service 

 if (smtpException.StatusCode == SmtpStatusCode.Ok) 
   throw smtpException; 
 // When the SMTP host is not found check for the following value 

 if (smtpException.StatusCode == SmtpStatusCode.GeneralFailure) 
   throw smtpException;             
} 

Поймай SmtpFailedRecipientException: SmtpFailedRecipientException класс имеет дело с исключением, связанным с получатель электронного письма, например SMTP не может отправить электронное письмо получатель. SmtpFailedRecipientException происходит, когда SmtpClient не может завершить SmtpClient.Send() или SmtpClient.SendAsync() операция для конкретного получателя. Чтобы поймать это исключение, используйте следующий код:

catch (System.Net.Mail.SmtpFailedRecipientException smtpFailedRecipientException) 
{ 
 // Get the email that is causing email sending failed exception 
 String emailCausingException = smtpFailedRecipientException.FailedRecipient; 

 // Get the status code why and what is actually causing an email sending error 
 System.Net.Mail.SmtpStatusCode statusCode = smtpFailedRecipientException.StatusCode; 

 // Take some action either re-send the email again or do some error handling code here 
}

Поймай SmtpFailedRecipientsException: SmtpFailedRecipientsException на самом деле коллекция SmtpFailedRecipientException объектов, служащих той же цели. это используется для обработки исключений, когда SmtpClient не может отправлять электронные письма одному или нескольким получателям.

catch (System.Net.Mail.SmtpFailedRecipientsException smtpFailedRecipientsException) 
{ 
 ArrayList emailCausingException = new ArrayList(); 

 foreach (SmtpFailedRecipientException smtpFailedRecipientException 
               in smtpFailedRecipientsException.InnerExceptions) 
{ 
   // Get the email that is causing email sending failed exception 
   // Add it to a list of emails with exceptions 
   emailCausingException.Add(smtpFailedRecipientException.FailedRecipient);

   // Get the status code why and what is actually causing an email sending error 
   System.Net.Mail.SmtpStatusCode statusCode = smtpFailedRecipientException.StatusCode; 
   // Take some action either re-send the email again or do some error handling 
   // You can also log or print this status code for an individual recipient here 
   if (statusCode == SmtpStatusCode.MailboxBusy) 
   { 
     //Re-Send email after some time 
     System.Threading.Thread.Sleep(1000); 
     //smtpClient.Send(); 
     //Email sending code here 
   } 
 } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...