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

2 回答 2

4

循环中的这一行是问题所在:

messager.Body = item;

Body每次都在覆盖该属性,因此只有最后一项会在循环之后出现。你想追加:

messager.Body += item;

当然,还有更多的方法可以做到这一点,而这个实际上有点草率。查看StringBuilder该类以创建格式化字符串并构建您的电子邮件正文,然后只需将电子邮件正文设置为.ToString()对象StringBuilder


另外,作为旁注,此代码没有任何用途:

catch (Exception)
{
    throw;
}

如果您实际上没有以任何有意义的方式处理异常,为什么要捕获它呢?代码将抛出异常,所以让它抛出异常。绝对没有理由在这里抓住它,这只会在代码中产生噪音。

此外,这个也很糟糕:

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

您正在抑制原始异常并创建一个全新的异常。您正在丢失原始异常中的堆栈跟踪和任何其他有用信息。SmtpException您想将s 转换为s是否有特殊原因ApplicationException?至少,将 的InnerException属性设置ApplicationException为 ,SmtpException这样您就不会完全丢失该信息。

但是,更重要的是,就像上面一样,您实际上并没有以任何有意义的方式处理异常。没有添加任何上下文,没有进行日志记录,无论如何你都会抛出异常。同样,这只是代码中的噪音。如果您不打算实际处理它,则没有理由捕获异常。

于 2012-04-10T14:04:14.273 回答
3

您当前的代码在每次迭代中覆盖正文,将其分配给每个项目 - 导致最后一项成为正文。

您需要附加到正文中:

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

注意+=运算符而不是=

此外,您根本不需要循环 - 只需使用类的方便Join()方法即可使用string越来越少的可读代码来实现相同的结果。

于 2012-04-10T13:59:39.580 回答