您的解決方案的一個好的開始將實際利用什麼catch
可以做什麼,以及各種類別提供反饋。
您當前的實現對處理沒有任何作用。智能感知可能該標記ex
不使用
catch (Exception ex) {
return false;
}
在SMTP異常的情況下,可以檢索實際狀態代碼,並期待什麼裝置的狀態。這將在您現有的通用捕獲和處理程序之上。
catch (SmtpException sx) { // general SMTP errors
var smtpStatus = sx.StatusCode;
// See for values: https://msdn.microsoft.com/en-us/library/system.net.mail.smtpstatuscode(v=vs.110).aspx
LogSmtpException(sx); // Log your exception review (you need to create)
return false;
}
catch (Exception ex) { // general error NOT previously caught
LogException(ex); // Log your exception review (you need to create)
return false;
}
但有一個更具體的SMTP異常,你可以得到,通常是一個錯誤的地址,這樣我們就可以把那對其他2個漁獲物頂部
catch (SmtpFailedRecipientException rx) { // Bad recipient
var smtpStatus = rx.StatusCode; // inherited from SmtpException
// SEE: https://msdn.microsoft.com/en-us/library/system.net.mail.smtpfailedrecipientexception(v=vs.110).aspx
LogSmtpException(sx); // Log your exception review (same as SmtpException)
return false;
}
catch (SmtpException sx) { // general SMTP errors
var smtpStatus = sx.StatusCode;
LogSmtpException(sx);
return false;
}
catch (Exception ex) { // general error NOT previously caught
LogException(ex);
return false;
}
什麼我已實施
我的「發送郵件」例程不是bool方法;它實際上會返回一個由主叫方解釋的KeyValuePair<int, string>
。
KeyValuePair<int, string> MessageStatus = new SendMail(my values);
if ((int)MessageStatus.Key == 250) {
// all ok, proceed as normal
}
else {
ViewData["StatusCode"] = MessageStatus.Key;
ViewData["StatusMessage"] = MessageStatus.Value;
}
而我的SendMail結構是這樣的。在事件發生時我沒有查找確切的原因,但我記錄了例外情況以供以後查看。
public KeyValuePair<int, string> SendMail (my values) {
int StatusCode;
string StatusMessage;
// ===== standard message building code =====
try {
// ===== smtp client setup code =====
smtp.Send(mail);
StatusCode = 250; // Standard SMTP OK
StatusMessage = "Message Sent";
}
catch (SmtpFailedRecipientException rx) {
LogExceptionSMTP(rx, message.To);
StatusCode = (int)rx.StatusCode;
StatusMessage = rx.Message;
}
catch (SmtpException sx) {
LogExceptionSMTP(sx, message.To);
StatusCode = (int)sx.StatusCode;
StatusMessage = sx.Message;
}
catch (Exception ex) {
ex.Data.Add("SendMail_Recipient", message.To);
LogException(ex);
StatusCode = 500; // Standard App Error Code
StatusMessage = ex.Message;
}
的[SmtpClient得到從發送服務器導致]可能的複製(http://stackoverflow.com/questions/7273949/smtpclient-get-result-from-server-on-send) – arbitrarystringofletters