2015-04-21 7 views
3

Вот моя проблема. Я посылаю электронное письмо нескольким контактам, и я улавливаю ошибку, если есть unvalid адрес электронной почты.SMTP Отправить get SmtpFailedRecipientException

В основном, он работает, но если есть более 1 недействительного электронного письма, я не получаю уведомление от других неправильных адресов электронной почты.

data = XMLProcessing.LoadAll(); 

foreach (XMLData.StructReceiver user in data.Receiver) 
{ 
    AddReceiver(user.Mail); 
} 

SetSubject(data.Body.Subject); 
SetMessage(data.Body.Content); 

SetSender(data.SenderReply.Sender); 
SetReply(data.SenderReply.Replyer); 

try 
{     
    SMTP.Send(Message);     
} 
catch (SmtpFailedRecipientException e) 
{ 
    if (e.FailedRecipient.ToString() != data.SenderReply.Replyer) 
    { 
     Failed.Add(e.FailedRecipient.ToString()); 
    } 
} 
finally 
{ 
    SMTP.Dispose(); 
} 

Я получаю уведомление пути добавления контакта в список и затем отправить этот список моего Personnal электронной почты адресат, но поймать случается только один раз, даже если есть больше чем 1 плох адресат.

+0

это то, что подвох блок должен делать ... когда ошибка ловится он никогда не возвращается к коду, чтобы проверить, являются ли больше ошибок еще там...?? –

+0

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

ответ

1

См. SmtpFailedRecipientsException. Обратите внимание, что это другой класс, SmtpFailedRecipient s Исключение. Этот класс фактически подклассы SmtpFailedRecipientException (нет).

Вы должны поймать SmtpFailedRecipientsException (более конкретный тип), прежде чем поймать более общий.

В дополнение к унаследованным полям от его родителя, он также предоставляет InnerExceptions (обратите внимание на множественное число s, снова). Это сборник исключений о сбоях отправки для все адресов. Вы можете перебирать, что, как описано в статье MSDN:

try 
{ 
    SMTP.Send(Message);     
} 
catch (SmtpFailedRecipientsException exs) 
{ 
    foreach (SmtpFailedRecipientException e in exs) 
    { 
     if (e.FailedRecipient.ToString() != data.SenderReply.Replyer) 
     { 
      Failed.Add(e.FailedRecipient.ToString()); 
     } 
    } 
} 
catch (SmtpFailedRecipientException e) 
{ 
    if (e.FailedRecipient.ToString() != data.SenderReply.Replyer) 
    { 
     Failed.Add(e.FailedRecipient.ToString()); 
    } 
} 
finally 
{ 
    SMTP.Dispose(); 
} 
+0

Спасибо! Я не заметил, что существует еще один класс для нескольких исключений ... Должен ли я по-прежнему захватывать с помощью SmtpFailedRecipientException, если существует только одно исключение? – Wanceslas

+1

Эта часть неясна, и документация MSDN не дает понять. Вопрос, который вы задаете, эквивалентен «Являются ли экземпляры« SmtpFailedRecipientException »также экземплярами« SmtpFailedRecipientsException »?». Документация здесь неясна. Вы можете попробовать его в тестировании и выяснить ответ, хотя, вероятно, * ok * оставить более общий блок catch, после того, как он не будет запущен. – EyasSH

+1

Я сделал несколько тестов и пришел к выводу, что элементы, обнаруженные из SmtpFailedRecipientsException, не являются экземплярами SmtpFailedRecipientException. Так что, если функция send только одного броска ошибки, SmtpFailedRecipientsException не будет вызывать. – Wanceslas