如何使用变量从数据表中列出多个数据

时间:2013-11-01 22:42:53

标签: c# datatable datarow

我编写了以下程序,将HTML电子邮件发送给此表中的演示用户:

enter image description here

我只想发送一封电子邮件,并列出每位客户的所有信息。目前,如果客户有10本书过期,那么客户将根据表格结构获得10封电子邮件,因为每本书籍贷款都是单独的记录。

例如:

亲爱的吉姆凯莉: 以下书籍到期:

  1. 如何修理汽车
  2. 詹姆斯邦德归来
  3. 我是否可以为每位客户仅发送一封电子邮件,但列出电子邮件中的每个项目。例如列出所有到期书籍?

    Fox示例:使用上表发送电子邮件,Jim Carey将收到2封电子邮件,而不是1封。我只想发送一封电子邮件,但列出两本书。

    class Program
    {
    static DataSet dtProfile = Database.AcquireData();
    static DataTable table = dtProfile.Tables[0];
    
    static string CustFName;
    static string CustLName;
    static string CheckoutDate;
    static string DueDate;
    static string BookName;
    
    public static void SendEmail()
    {
        foreach (DataRow row in table.Rows)
        {
         CustFName = row["CustFName"].ToString();
         CustLName = row["CustLName"].ToString();
         CheckoutDate = row["CheckoutDate"].ToString();
         DueDate = row["DueDate"].ToString();
         BookName = row["BookName"].ToString();          
         string body = PopulateBody(CustFName, CustLName, CheckoutDate, DueDate, BookName);<br />
         SendHtmlFormattedEmail("Email", "Subject", body);
        }
    }
    
    public static string PopulateBody(string custFName, string custLName,
        string checkoutDate, string dueDate, string bookName)
    {
        string body = string.Empty;
    
        using (StreamReader reader = 
            new StreamReader(Path.GetFullPath(@"Z:\folder\email.html")))
        {
            body = reader.ReadToEnd();
        }
        body = body.Replace("{#First Name#}", custFName);
        body = body.Replace("{#Last Name#}",  custLName);
        body = body.Replace("{#Checkout Date#}", checkoutDate);
        body = body.Replace("{#Due Date#}",  dueDate);
        body = body.Replace("{#Book Name#}", bookName);
    
        return body;
    }
    
    public static void SendHtmlFormattedEmail(string recepientEmail, string subject, string body)
    {
        using (MailMessage mailMessage = new MailMessage())
        {
          mailMessage.From = new MailAddress(ConfigurationManager.AppSettings["UserName"]);
          mailMessage.Subject = subject;
          mailMessage.Body = body;
          mailMessage.IsBodyHtml = true;
          mailMessage.To.Add(new MailAddress(recepientEmail));
          SmtpClient smtp = new SmtpClient();
          smtp.Host = ConfigurationManager.AppSettings["Host"];
          smtp.EnableSsl = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableSsl"]);
          System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
          NetworkCred.UserName = ConfigurationManager.AppSettings["UserName"];
          NetworkCred.Password = ConfigurationManager.AppSettings["Password"];
          smtp.UseDefaultCredentials = true;
          smtp.Credentials = NetworkCred;
          smtp.Port = int.Parse(ConfigurationManager.AppSettings["Port"]);
          smtp.Send(mailMessage);
        }
    }
    
    static void Main(string[] args)
    {
        SendEmail();
    }
    
    }
    

2 个答案:

答案 0 :(得分:1)

为每个电子邮件地址创建一组电子邮件数据。然后迭代各个地址并发送电子邮件。

class Program
{
    static DataSet dtProfile = null; //Database.AcquireData();
    static DataTable table = dtProfile.Tables[0];

    public static void SendEmail()
    {
        // Create the dictionary to hold the email data for each individual email. This allows us 
        // to group all of the books due for an individual together.  We will use the email address
        // as the key for the dictionary instead of CustomerID in case the user has given us two
        // different email addresses.
        Dictionary<string, List<DataRow>> emailList = new Dictionary<string, List<DataRow>>();

        // Iterate over the dataset and populate the dictionary
        foreach (DataRow row in table.Rows)
        {
            // grab the email address, will be the key for the dictionary
            string email = row["Email"].ToString();

            // if we haven't processed a row for this email yet, initialize the entry for it
            if (!emailList.ContainsKey(email))
            {
                emailList.Add(email, new List<DataRow>());
            }

            // add the datarow for the overdue book for the email
            emailList[email].Add(row);
        }

        // Now, craft and send an email for each unique email address in the list
        foreach (string email in emailList.Keys)
        {
            // create a string builder to build up the body of the email
            StringBuilder body = new StringBuilder();
            body.Append("<html>");
            body.Append("<body>");

            // assume the first/last name will be the same for each row, so just get the
            // name information from the first row to build the opening line of the email
            DataRow firstRow = emailList[email][0];
            body.AppendFormat("<p>Dear {0} {1}:  The following book(s) are due:</p>", firstRow["FName"].ToString(), firstRow["LName"].ToString());
            body.Append("<ol>");

            // now just add a line item for each book
            foreach (DataRow row in emailList[email])
            {
                body.AppendFormat("<li>{0}</li>", row["BookName"].ToString()); 
            }

            // close up your html tags
            body.Append("</ol>");
            body.Append("</body>");
            body.Append("</html>");

            // finally, send the email
            SendHtmlFormattedEmail(email, "Overdue Books", body.ToString());
        }
    }

    public static void SendHtmlFormattedEmail(string recepientEmail, string subject, string body)
    {
        using (MailMessage mailMessage = new MailMessage())
        {
            mailMessage.From = new MailAddress(ConfigurationManager.AppSettings["UserName"]);
            mailMessage.Subject = subject;
            mailMessage.Body = body;
            mailMessage.IsBodyHtml = true;
            mailMessage.To.Add(new MailAddress(recepientEmail));
            SmtpClient smtp = new SmtpClient();
            smtp.Host = ConfigurationManager.AppSettings["Host"];
            smtp.EnableSsl = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableSsl"]);
            System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
            NetworkCred.UserName = ConfigurationManager.AppSettings["UserName"];
            NetworkCred.Password = ConfigurationManager.AppSettings["Password"];
            smtp.UseDefaultCredentials = true;
            smtp.Credentials = NetworkCred;
            smtp.Port = int.Parse(ConfigurationManager.AppSettings["Port"]);
            smtp.Send(mailMessage);
        }
    }

    static void Main(string[] args)
    {
        SendEmail();
    }

}

答案 1 :(得分:0)

使用Jason Young的示例,但略微修改以分隔每个不同客户的电子邮件。

string lastCustId = "none";
foreach (DataRow row in table.Rows)
{
    if (!lastCustId.Equals("none") && !row["CustId"].ToString().Equals(lastCustId))
    {
        // Different customer's record, fire off the email to previous one
        SendHtmlFormattedEmail("Email", "Subject", body.ToString());
        lastCustId = row["CustId"].ToString();
    }
    // Build email for current customer
    CustFName = row["CustFName"].ToString();
    CustLName = row["CustLName"].ToString();
    CheckoutDate = row["CheckoutDate"].ToString();
    DueDate = row["DueDate"].ToString();
    BookName = row["BookName"].ToString();          
    body.AppendLine(PopulateBody(CustFName, CustLName, CheckoutDate, DueDate, BookName, template));
    // not sure what your template looks like, but this would be whatever
    // markup or text you would want separating your book details
    body.AppendLine("<br>");        
}
// Finally send email to the last customer in above loop
SendHtmlFormattedEmail("Email", "Subject", body.ToString());