c# - 判断System.Net.Mail.SmtpClient.Send结果

标签 c# exception sendmail

我正在尝试使用枚举总结 System.Net.Mail.SmtpClient.Send 的结果。这样我就知道我是否应该重试发送电子邮件并希望防止发送重复的电子邮件。

public enum MailSendStatus {
    None,
    Sent,
    ErrorCannotSend,
    TryAgain,
    SentMaybe
}

我已经捕获了来自Send 的所有异常并从http://msdn.microsoft.com/en-us/library/system.net.mail.smtpstatuscode(v=vs.80).aspx 中分离出SmtpException.StatusCodes .分割看起来正确吗?或者有更好的方法吗?

try {
    smtp.Send(msg);
} catch (ArgumentNullException e) {
    return MailSendStatus.ErrorCannotSend;
} catch (ObjectDisposedException e) {
    return MailSendStatus.ErrorCannotSend;
} catch (InvalidOperationException e) {
    return MailSendStatus.ErrorCannotSend;
} catch (SmtpFailedRecipientsException e) {
    return MailSendStatus.ErrorCannotSend;
} catch (SmtpException e) {
    switch(e.StatusCode) {
        case SmtpStatusCode.BadCommandSequence:
        case SmtpStatusCode.MailboxNameNotAllowed:
        case SmtpStatusCode.HelpMessage:
        case SmtpStatusCode.SyntaxError:
        case SmtpStatusCode.SystemStatus:
            return MailSendStatus.ErrorCannotSend;
        case SmtpStatusCode.CannotVerifyUserWillAttemptDelivery:
        case SmtpStatusCode.UserNotLocalWillForward:
            return MailSendStatus.SentMaybe;
        case SmtpStatusCode.ClientNotPermitted:
        case SmtpStatusCode.CommandNotImplemented:
        case SmtpStatusCode.CommandParameterNotImplemented:
        case SmtpStatusCode.CommandUnrecognized:
        case SmtpStatusCode.ExceededStorageAllocation:
        case SmtpStatusCode.GeneralFailure:
        case SmtpStatusCode.InsufficientStorage:
        case SmtpStatusCode.LocalErrorInProcessing:
        case SmtpStatusCode.MailboxBusy:
        case SmtpStatusCode.MailboxUnavailable:
        case SmtpStatusCode.MustIssueStartTlsFirst:
        case SmtpStatusCode.ServiceClosingTransmissionChannel:
        case SmtpStatusCode.ServiceNotAvailable:
        case SmtpStatusCode.ServiceReady:
        case SmtpStatusCode.StartMailInput:
        case SmtpStatusCode.TransactionFailed:
        case SmtpStatusCode.UserNotLocalTryAlternatePath:
            return MailSendStatus.TryAgain;
        case SmtpStatusCode.Ok:
            break;
    }
} catch (Exception e) { 
    return MailSendStatus.SentMaybe;
}
return MailSendStatus.Sent;

最佳答案

catch (ArgumentNullException e) {    return MailSendStatus.ErrorCannotSend;} catch 
(ObjectDisposedException e) {    return MailSendStatus.ErrorCannotSend;} catch 
(InvalidOperationException e) {    return MailSendStatus.ErrorCannotSend;

我不喜欢这个。 ArgumentNull、ObjectDisposed 是编程错误(与 InvalidOperation 一样)。您不应将它们分解为 SMTP 错误,而应修复它们。 Fpr 这个,使程序崩溃是好的(并给出堆栈跟踪)。接近“快速失败”。不要重新处理您不知道如何处理的异常,InvalidOperationException、ObjectDisposedException 表示状态有问题,ArbumentNullException 是用法/ui 错误。

关于c# - 判断System.Net.Mail.SmtpClient.Send结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5658980/

相关文章:

c# - 重构异常处理

c# - 如何使用 EF 在某些情况下执行删除行?

exception - 为什么 Mule 回滚异常会传播到调用它的流?

c# - 如何解决 XUnit 测试失败并在 "Run All"下的 NLog 目标中断言消息的情况

c++ - 在 vector 的 vector 上捕获 out_of_range

spring - 如何在 Grails 电子邮件服务中获取自定义 "from address"

sendmail - Plesk Parallels 无法向具有外部 MX 记录的帐户发送电子邮件

javascript - 发送电子邮件而不等待操作完成执行

c# - EF 核心 "Group By could not be translated and will be evaluated locally."

c# - 使用 SSH 连接 Unix/Solaris 和 .NET