Ошибка отправки отправленного письма - PullRequest
0 голосов
/ 23 ноября 2011

Есть ли способ получить сообщение об ошибке от smtp, чтобы проверить, успешно ли отправлено письмо?

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

Я ищу следующие ошибки: почта не может быть доставлена, потому что почтовый адрес не существует, почтовый ящик заполнен и т. Д. *

С уважением, Меир.

Ответы [ 3 ]

1 голос
/ 23 ноября 2011

Я не уверен, чего вы пытаетесь достичь, но это поможет вам.

Полагаю, вы уже знаете о DeriveryNotificationOptions property на System.Net.Mail.MailMessage.Единственная сложность, связанная с использованием этого свойства, заключается в том, что его тип enum представляет битовое поле, поэтому вы должны установить для него сумму параметров, которые вы хотите применить.

Например, если вы хотите получать уведомление о доставке в случае задержки, сбоя или успеха, вы должны установить для свойства

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 голосов
/ 30 августа 2012

Этот пост мне полезен.

Кстати, если вы используете .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"));
        }
    }
0 голосов
/ 23 ноября 2011

Подобные ошибки имеют асинхронный характер. При отправке почты вы общаетесь с локальным сервером smtp вашего провайдера. Затем этот сервер начинает доставлять почту в целевую почтовую систему.

Таким образом, класс SmtpClient может отображать только ошибки, возникающие при обращении к локальному серверу SMTP.

Обычно, когда в целевой системе возникает ошибка типа «неизвестный пользователь», на электронный адрес отправителя отправляется электронное письмо с сообщением об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...