열거 형을 사용하여 System.Net.Mail.SmtpClient.Send
의 결과를 요약하려고합니다. 이것은 내가 이메일을 보내려고 다시 시도해야하고 잘하면 발송되는 중복 이메일을 방지해야할지 여부를 알고 있습니다.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
의를 분할했다. 고장이 올바르게 보이나요? 아니면 이것을 할 수있는 더 좋은 방법이 있습니까?
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;
나는 명료성을 위해 로그 문을 생략했지만, 대부분 개발 중에 발견되어야한다. 나는 방금 msdn 페이지에 모든 예외를 포함했다. http://msdn.microsoft.com/en-us/library/swas0fwc.aspx – djeeg
나는 그다지 좋아하지 않는다. 정말. 문제는 더 이상 실제 버드를 잡는 것이 매우 어렵다는 것입니다. 나는 내부 오류를 숨기지 않으며 빠른 정리를 위해 가능한 한 눈에 띄기를 원합니다. – TomTom
catch 트리에서 해당 사례를 제거하면 generic ('Exception e)'이 트리거되어 "상태가 전송되었을 수 있습니다"상태 코드가 반환됩니다. 올바르지 않습니다. 오류가 발생했습니다. 다시 throw 할 수 있습니다. 예외 – djeeg