2013-02-28 71 views
1

我試圖讓我的頭繞着System.Net.Mail類,但我很難找到像樣的文檔。smtpfailedrecipientsexception是否適用於CC和BCC

第一個查詢 - 說我有一封電子郵件,其中包含CC和BCC電子郵件,是否需要捕獲SmtpFailedRecipientsException而不是SmtpFailedRecipientException(注意單元格收件人),還是打算髮送給多個TO收件人?

第二個查詢 - 當我使用下面的方法,通過迭代例外,將內部例外涉及到那些已逝去的電子郵件地址,如BCC但不是TO或CC。如果是這種情況,那麼重新發送然後再去所有3?

static void CheckExceptionAndResend(SmtpFailedRecipientsException ex, SmtpClient client, MailMessage message) 
    { 
     var status = ex.StatusCode; 

     for (int i = 0; i < ex.InnerExceptions.Length; i++) 
     { 
      if (status == SmtpStatusCode.MailboxBusy || 
       status == SmtpStatusCode.MailboxUnavailable || 
       status == SmtpStatusCode.TransactionFailed) 
      { 
       System.Threading.Thread.Sleep(3000); 
       client.Send(message); 
      } 
      else 
      { 
       // TODO: Log delivery failure 
      } 
     } 
    } 

所有建議讚賞。提前致謝。

回答

1

我不知道,不能回答你的第一個查詢,但回答:第二個,如果你沒有任何地方發送消息除了這種方法,我不明白是怎麼消息將再次發送或兩次給收件人..

但是,如果您在因爲異常而調用該方法之前使用smtpclient實例發送消息,那麼是的,該消息會再次交付給所有3即TO,BCC和CC,而不是僅針對失敗的收件人。

+0

是的,有一個方法調用client.Send()然後調用SmtpFailedRecipientsException異常中顯示的方法。你已經回答了第二部分。這似乎是合乎邏輯的,因爲信息從來沒有被「重建」過,只是憎恨。 – dotnetnoob 2013-02-28 19:21:03

+0

此外,似乎只會針對本地電子郵件地址拋出異常,因此,如果我將電子郵件發送給用戶而不是我自己的內部管理員,則不會發生異常。 – dotnetnoob 2013-02-28 19:23:36

+0

@dotnetnoob如果您位於Intranet中,則爲true,因爲您的smtp客戶端實例是使用您的Intranet的smtp郵件主機的值進行初始化的,該主機只能檢測本地郵件地址的故障,而不是其他人。 – user841311 2013-03-01 10:01:22

0

對於第一個查詢,請查看SmtpTransport.SendMail()的源代碼,該代碼由SmtpClient.Send()調用。如果只有一個收件人(無論To,CC或BCC)是否被拒絕,則生成的異常將爲SmtpFailedRecipientException,但如果拒絕了多個收件人,它將爲SmtpFailedRecipientsException。不便的是,我相信這意味着你需要嘗試捕捉這兩種類型。

相關問題