2012-04-10 54 views
0

我想通過我的emial安裝程序類在我的電子郵件正文中填充項目列表。 當我試圖在我的Outlook中打開電子郵件時,我可以看到只看到一個項目,我期待的項目列表。填充電子郵件正文中的項目列表

下面是我的代碼:

public class EmailSetup 
{ 
    string toEmailSetup = string.Empty; 
    string fromEmailSetup = string.Empty; 
    string domainName = string.Empty; 
    string emailServer = string.Empty; 

    public void ApplicationFailedEmailSetup(List<string>ApplicationsInactive,DateTime dateRun) 
    { 
     toEmailSetup = ConfigurationManager.AppSettings["To mailid"]; 
     fromEmailSetup = ConfigurationManager.AppSettings["From mailid"]; 
     domainName = ConfigurationManager.AppSettings["Domain Name"]; 
     emailServer = ConfigurationManager.AppSettings["Email Server"]; 
     try 
     { 
      var messager = new MailMessage(); 
      messager.To.Add(toEmailSetup); 
      messager.Subject = "Applications Crashed/Closed"; 
      messager.From = new MailAddress(fromEmailSetup); 
      try 
      { 
       messager.Body = "Following applications you are monitoring are closed are crashed:"; 
       **foreach (var item in ApplicationsInactive) 
       { 
        messager.Body = item; 
       }** // Here i am trying to populate list of applications. 
      } 
      catch (Exception) 
      { 
       throw; 
      } 

      var smtp = new SmtpClient(emailServer); 
      smtp.EnableSsl = true; 

      try 
      { 
       smtp.DeliveryMethod = SmtpDeliveryMethod.Network; 
       smtp.UseDefaultCredentials = false; 
       smtp.Send(messager); 
      } 
      catch (Exception) 
      { 

       throw; 
      } 

     } 
     catch (SmtpException ex) 
     { 
      throw new ApplicationException 
       ("SmtpException has occured: " + ex.Message); 
     } 

    } 

} 

回答

4

這條線在循環的問題是:

messager.Body = item; 

你覆蓋每一次Body財產,所以纔有了最後一個項目將在那裏循環以下。你想,而不是追加:

messager.Body += item; 

有更多的方式來做到這一點,當然,這一個實際上是一個有點草率。查看StringBuilder類來創建格式化的字符串並構建您的電子郵件正文,然後將電子郵件正文設置爲StringBuilder對象的.ToString()


此外,作爲一個側面說明,此代碼爲您服務沒有目的:

catch (Exception) 
{ 
    throw; 
} 

如果你沒有真正處理異常任何有意義的方式,爲什麼抓住它呢?代碼將拋出異常,所以只是讓它拋出異常。這裏絕對沒有理由去捕捉它,這只是在代碼中產生噪聲。

此外,這個也壞了:

catch (SmtpException ex) 
{ 
    throw new ApplicationException 
     ("SmtpException has occured: " + ex.Message); 
} 

你抑制原始的異常,並創建一個全新的一個。您正在丟失堆棧跟蹤以及原始異常中的任何其他有用信息。是否有特殊原因要將SmtpException s轉換爲ApplicationException s?至少,將ApplicationExceptionInnerException屬性設置爲SmtpException,以便您不會完全丟失該信息。

但是,更重要的是,如上所述,您實際上並沒有以任何有意義的方式處理異常。沒有上下文被添加到它,沒有記錄正在完成,並且你拋出異常。再次,這只是代碼中的噪音。如果你沒有真正處理它,沒有理由去捕捉異常。

+0

感謝您的答覆和感謝糾正我的代碼。我可以填充項目列表,但所有內容都只有一行。 – 62071072SP 2012-04-10 14:11:09

+1

@ 62071072:這是附加格式化的地方。你的方法取決於你的電子郵件是否(或者應該是)HTML。我在代碼中看不到HTML,所以我假設不是。但對於初學者,你可以嘗試一些簡單的事情:'messager.Body + = item + Environment.NewLine;' – David 2012-04-10 14:17:53

3

您當前的代碼重寫身在每次迭代中,分配給它的每個項目 - 導致最後一項是身體。

您需要追加的身體,而不是:

messager.Body = "Following applications you are monitoring are closed are crashed:"; 
messager.Body += string.Join(", ", ApplicationsInactive); 

注意+ =運營商,而不是僅僅=

而且,你不需要循環在所有 - 只使用string類的方便Join()方法來實現用更少的,更可讀的代碼相同的結果。

+0

ApplicationsInactive是一個列表,我想我不能將列表添加到join()方法 – 62071072SP 2012-04-10 14:05:27

+0

@ 62071072您可以從[.NET 4.0](http://msdn.microsoft.com/zh-cn/library/system .string.join(v = vs.100).aspx) - 如果舊框架更改爲'string.Join(「,」,ApplicationsInactive.ToArray());' – 2012-04-10 14:07:33

+0

感謝您的回覆。但是所有的這些問題一直都在一條線上。例如:下面的應用程序,你正在監控關閉崩潰:abc,akdksa,aodjal – 62071072SP 2012-04-10 14:17:44

相關問題