Я пытаюсь обобщить результаты System.Net.Mail.SmtpClient.Send
, используя перечисление. Это делается для того, чтобы я знал, следует ли мне повторить попытку отправки электронной почты и, надеюсь, предотвратить отправку дубликатов электронных писем.
public enum MailSendStatus {
None,
Sent,
ErrorCannotSend,
TryAgain,
SentMaybe
}
Я перехватил все исключения из Send
и выделил SmtpException.StatusCode
из http://msdn.microsoft.com/en-us/library/system.net.mail.smtpstatuscode(v=vs.80).aspx< /а>. Развал выглядит правильно? Или есть лучший способ сделать это?
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;
1 ответ
catch (ArgumentNullException e) { return MailSendStatus.ErrorCannotSend;} catch
(ObjectDisposedException e) { return MailSendStatus.ErrorCannotSend;} catch
(InvalidOperationException e) { return MailSendStatus.ErrorCannotSend;
Мне это не нравится. ArgumentNull, ObjectDisposed — ошибки программирования (как и InvalidOperation). Вы не должны разбивать их на ошибку SMTP, а исправлять их. Для этого сбой программы — это хорошо (и вывод трассировки стека). Подход «быстро ошибаться». Не повторяйте исключения, которые вы не знаете, как обрабатывать, а InvalidOperationException, ObjectDisposedException указывают на то, что что-то не так с состоянием, ArbumentNullException — это ошибка использования/пользовательского интерфейса.
(Exception e)
, возвращающий код состояния "возможно, отправлено", что неверно, это определенно была ошибка, я полагаю, что мог бы повторно выдать исключение
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.
SmtpStatusCode.CommandUnrecognized
указывает на то, что smtp-сервер или клиент обмениваются данными несовместимым образом, который нельзя исправить повторной попыткой.