2011-11-23 89 views
-2

有什么办法从smtp发送错误来检查邮件发送是否成功?获取发送的邮件错误

var smtpClient = new SmtpClient("SmtpServer"); 
       smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); 
smtpClient.SendAsync(mail, userId); 

我找的错误是:邮件不能被传递,因为邮件地址不存在,邮件箱满等..

问候, 梅厄。

回答

1

我不确定你想达到什么,但这会帮助你。

我假设您已经知道的System.Net.Mail.MailMessage。使用该属性唯一棘手的部分是它的枚举类型表示一个位域,所以你应该将它设置为你想应用的选项的总和。

例如,如果你想延迟,失败或成功送达通知,应该将属性设置为

DeliveryNotificationOptions.Delay + DeliveryNotificationOptions.OnFailure + DeliveryNotificationOptions.OnSuccess 

或者

这是一个方法来捕获故障报告或邮件未发送时的任何错误(失败报告)

// Change your Try-Catch to call the new method named 'CheckExceptionAndResend' 
// Error handling for sending message 
try 
{ 
    smtpClient.Send(message); 
    // Exception contains information on each failed receipient 
} 
catch (System.Net.Mail.SmtpFailedRecipientsException recExc) 
{ 
    // Call method that will analyze exception and attempt to re-send the email 
    CheckExceptionAndResend(recExc, smtpClient, message); 
} 
catch (System.Net.Mail.SmtpException smtpExc) 
{ 
    // Log error to event log using StatusCode information in 
    // smtpExc.StatusCode 
    MsgBox((smtpExc.StatusCode.ToString + " ==>Procedure SmtpException")); 
} 
catch (Exception Exc) 
{ 
    // Log error to event log using StatusCode information in 
    // smtpExc.StatusCode 
    MsgBox((Exc.Message + " ==>Procedure Exception")); 
} 


private void CheckExceptionAndResend(System.Net.Mail.SmtpFailedRecipientsException exObj, System.Net.Mail.SmtpClient smtpClient, MailMessage emailMessage) 
{ 
    try 
    { 
     for (int recipient = 0; (recipient <= (exObj.InnerExceptions.Length - 1)); recipient++) 
     { 
      System.Net.Mail.SmtpStatusCode statusCode; 
      // Each InnerException is an System.Net.Mail.SmtpFailed RecipientException 
      statusCode = exObj.InnerExceptions(recipient).StatusCode; 
      if (((statusCode == Net.Mail.SmtpStatusCode.MailboxBusy) 
         || (statusCode == Net.Mail.SmtpStatusCode.MailboxUnavailable))) 
      { 
       // Log this to event log: recExc.InnerExceptions(recipient).FailedRecipient 
       System.Threading.Thread.Sleep(5000); 
       smtpClient.Send(emailMessage); 
      } 
      else 
      { 
       // Log error to event log. 
       // recExc.InnerExceptions(recipient).StatusCode or use statusCode 
      } 
     } 
     MsgBox((exObj.Message + " ==>Procedure SmtpFailedRecipientsException")); 
    } 
    catch (Exception ex) 
    { 
     // At this point we have an non recoverable issue: 
     // NOTE: At this point we do not want to re-throw the exception because this method 
     // was called from a 'Catch' block and we do not want a hard error to display to the client. 
     // Options: log error, report issue to client via msgbox, etc. This is up to you. 
     // To display issue as you have before: 
     MsgBox((exObj.Message + " ==>Email was not sent")); 
    } 
} 
0

此类错误具有异步不适用真实存在。发送邮件时,您需要与提供商的本地smtp服务器通话。之后,该服务器开始将邮件传递到目标邮件系统。

因此,SmtpClient类只能向您的本地smtp服务器通话时显示出错。

通常,当目标系统上发生类似“未知用户”的错误时,它会向发件人的电子邮件地址发送一封包含失败消息的电子邮件。

0

此信息对我有帮助。

顺便说一下,如果你使用.net 4.0,这一个将是上述代码的变化。对不起,我的第一篇文章,我不知道为什么看起来这样。

下面的代码:

private void CheckExceptionAndResend(System.Net.Mail.SmtpFailedRecipientsException exObj, System.Net.Mail.SmtpClient smtpClient, MailMessage emailMessage) 
    { 
     try 
     { 
      for (int recipient = 0; (recipient <= (exObj.InnerExceptions.Length - 1)); recipient++) 
      { 
       System.Net.Mail.SmtpStatusCode statusCode; 

       // Each InnerException is an System.Net.Mail.SmtpFailed RecipientException 
       //for .net 4.0 
       //statusCode = exObj.InnerExceptions(recipient).StatusCode; 

       statusCode = exObj.StatusCode; 

       //if (((statusCode == Net.Mail.SmtpStatusCode.MailboxBusy) || (statusCode == Net.Mail.SmtpStatusCode.MailboxUnavailable))) 
       //for .net 4.0 
       if (((statusCode == System.Net.Mail.SmtpStatusCode.MailboxBusy) 
          || (statusCode == System.Net.Mail.SmtpStatusCode.MailboxUnavailable))) 
       { 
        // Log this to event log: recExc.InnerExceptions(recipient).FailedRecipient 
        System.Threading.Thread.Sleep(5000); 
        smtpClient.Send(emailMessage); 
       } 
       else 
       { 
        // Log error to event log. 
        // recExc.InnerExceptions(recipient).StatusCode or use statusCode 
       } 
      } 
      //MsgBox((exObj.Message + " ==>Procedure SmtpFailedRecipientsException")); 
     } 
     catch (Exception ex) 
     { 
      // At this point we have an non recoverable issue: 
      // NOTE: At this point we do not want to re-throw the exception because this method 
      // was called from a 'Catch' block and we do not want a hard error to display to the client. 
      // Options: log error, report issue to client via msgbox, etc. This is up to you. 
      // To display issue as you have before: 
      // MsgBox((exObj.Message + " ==>Email was not sent")); 
     } 
    }