J'essaie de résumer les résultats de System.Net.Mail.SmtpClient.Send
en utilisant une énumération. C'est ainsi que je sais si je devrais réessayer d'envoyer l'email et j'espère empêcher des email en double étant envoyés.Déterminer le résultat System.Net.Mail.SmtpClient.Send
public enum MailSendStatus {
None,
Sent,
ErrorCannotSend,
TryAgain,
SentMaybe
}
J'ai pris toutes les exceptions de Send
et de diviser les SmtpException.StatusCode
s de http://msdn.microsoft.com/en-us/library/system.net.mail.smtpstatuscode(v=vs.80).aspx. La ventilation semble-t-elle correcte? Ou y a-t-il une meilleure façon de faire cela?
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;
J'ai omis les instructions log pour plus de clarté, mais oui celles-ci devraient surtout être prises en développement. Je viens d'inclure toutes les exceptions sur la page msdn http://msdn.microsoft.com/en-us/library/swas0fwc.aspx – djeeg
Je n'aime pas ça. Vraiment. Le problème est qu'il est très difficile d'attraper un vrai bourgeon plus bas. Je ne cache jamais les erreurs internes et je les veux aussi visibles que possible pour un nettoyage rapide. – TomTom
si je supprime ces cas de l'arbre de capture, le générique '(Exception e)' se déclenchera, renvoyant un code d'état "peut-être envoyé", ce qui n'est pas correct, il était définitivement une erreur, je suppose que je pourrais relancer l'exception – djeeg