2012-06-29 57 views
0

我正在開發一個用於發送電子郵件的asp.net應用程序。我想確保如果出現問題,它會記錄錯誤並移至下一條記錄。我正在使用SmtpClient類來發送電子郵件。但現在,如果某個電子郵件地址錯誤,它只會崩潰。如何強制它移動到下一個記錄?使用asp.net發送電子郵件而不會使應用程序崩潰

我的代碼是這樣的:

var EmailsQueue = context.WC_EmailToolQueue.Where(t => t.EmailDate == null).ToList(); 

      foreach (var email in EmailsQueue) 
      { 
       MailMessage message = new MailMessage(); 
       message.From = new MailAddress(email.WC_EmailToolTemplates.SenderEmail); 
       message.To.Add(new MailAddress(email.Email)); 
       message.Body = body; 
       message.IsBodyHtml = true; 
       message.Subject = subject; 

       using (SmtpClient smtp = new SmtpClient 
       { 
        Host = email.WC_EmailToolTemplates.Host, 
        Port = email.WC_EmailToolTemplates.Port, 
        Credentials = new NetworkCredential(email.WC_EmailToolTemplates.SMTPUser, email.WC_EmailToolTemplates.SMTPPass), 
        EnableSsl = email.WC_EmailToolTemplates.EnableSSL 
       }) 
        try 
       { 
        smtp.Send(message); 
       } 
       catch (Exception ex) { 

       } 
       } 

問候, 阿西夫·哈米德

回答

0

您可以使用try catch塊。如果地址不是有效格式,則Add函數將引發錯誤。如果需要的話您可以登錄也

try 
    { 
     message.To.Add(new MailAddress(email.Email)); 
    } 
    catch (FormatException ex) 
    { 
     //If you want you may log it here 
    } 

編輯:依照OP的問題編輯。

下面的代碼將跳過發送電子郵件到有問題的項目(壞地址等),但執行循環的其餘項目

foreach (var email in EmailsQueue) 
{ 
    MailMessage message = new MailMessage(); 
    try 
    { 
     message.From = new MailAddress(email.WC_EmailToolTemplates.SenderEmail); 
     message.To.Add(new MailAddress(email.Email));    
     message.Body = body; 
     message.IsBodyHtml = true; 
     message.Subject = subject; 

     using (SmtpClient smtp = new SmtpClient 
     { 
      Host = email.WC_EmailToolTemplates.Host, 
      Port = email.WC_EmailToolTemplates.Port, 
      Credentials = new NetworkCredential(email.WC_EmailToolTemplates.SMTPUser, email.WC_EmailToolTemplates.SMTPPass), 
      EnableSsl = email.WC_EmailToolTemplates.EnableSSL 
     }) 
     smtp.Send(message); 
    } 
    catch (Exception ex) 
    { 
     //error in sending email to one item in collection 
     //Log it ig you want .Foreach will continue with remaining items  
    } 
} 
+0

我已經這樣做了,但我希望在記錄後發送電子郵件到下一個記錄。它不是在做 – DotnetSparrow

+0

你是在循環中做它嗎?然後顯示代碼 – Shyju

+0

是的,請檢查更新代碼 – DotnetSparrow

2

捕捉使用try/catch語句的例外。

try 
{ 
    // Send Email code 
} 
catch (Exception ex) //Or specific exceptions 
{ 
    Log(ex.ToString()); 
} 
+0

我已經這樣做了,但我希望在記錄之後發送電子郵件到下一條記錄。它不是在做 – DotnetSparrow

+0

然後你需要發佈更多的代碼,包括try/catch,所以我們可以指導你。 – Khan

+0

jeff:請更新代碼 – DotnetSparrow

0

只是把一些日誌記錄在你的catch塊已有。然後,foreach循環將繼續執行下一條記錄:

var EmailsQueue = context.WC_EmailToolQueue.Where(t => t.EmailDate == null).ToList(); 

    foreach (var email in EmailsQueue) 
    { 
     MailMessage message = new MailMessage(); 
     message.From = new MailAddress(email.WC_EmailToolTemplates.SenderEmail); 
     message.To.Add(new MailAddress(email.Email)); 
     message.Body = body; 
     message.IsBodyHtml = true; 
     message.Subject = subject; 

     using (SmtpClient smtp = new SmtpClient 
     { 
      Host = email.WC_EmailToolTemplates.Host, 
      Port = email.WC_EmailToolTemplates.Port, 
      Credentials = new NetworkCredential(email.WC_EmailToolTemplates.SMTPUser, email.WC_EmailToolTemplates.SMTPPass), 
      EnableSsl = email.WC_EmailToolTemplates.EnableSSL 
     }) 
      try 
      { 
       smtp.Send(message); 
      } 
      catch (Exception ex) 
      { 
       //log the error here <-------- 
      } 
    } 
相關問題