2017-05-10 136 views
0
public bool SendEmailToActivate(string email) 
     { 
      try 
      { 
       MailMessage mail = new MailMessage(); 
       SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com"); 

       mail.From = new MailAddress("[email protected]"); 
       mail.To.Add("[email protected]"); 
       mail.Subject = "Test Mail"; 
       mail.Body = "This is for testing SMTP mail from GMAIL"; 

       SmtpServer.Port = 587; 
       SmtpServer.Credentials = new System.Net.NetworkCredential("[email protected]", "password"); 
       SmtpServer.EnableSsl = true; 

       SmtpServer.Send(mail); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
     } 

如何知道郵件發送成功的用戶或不在c#中。即。如果郵件沒有發送給用戶,那麼我想要失敗郵件的數量..請幫助我。如何知道發送郵件失敗的郵件在c#

+2

的[SmtpClient得到從發送服務器導致]可能的複製(http://stackoverflow.com/questions/7273949/smtpclient-get-result-from-server-on-send) – arbitrarystringofletters

回答

0

您的解決方案的一個好的開始將實際利用什麼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; 
    } 
+0

如果一些人給錯誤的郵件然後如何才能知道郵件是否發送..? –

+0

@DEVASISHBEHARA你只能告訴電子郵件是否被髮送;如果不是,則由於異常處理程序記錄地址,您知道哪個地址不正確。如果有人給你一個確實存在的不正確的地址,你發送的郵件將會出錯。這就是爲什麼許多網站會讓用戶輸入電子郵件兩次或發送確認郵件。 –

+0

#Mad Myche: - 如果郵件地址不可用,那麼郵件沒有發送給任何其他人,那麼它發送到我的郵件ID與消息當時沒有找到地址我怎麼知道..?郵件是否送達? –