我正在尝试使用枚举总结 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.StatusCode
s .分割看起来正确吗?或者有更好的方法吗?
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/