2013-11-01 1 views
0

я написал ниже программу для отправки HTML Email демонстрационных пользователей в этой таблице:Как перечислить несколько элементов данных из таблицы данных, используя переменную

enter image description here

Я хочу послать только один адрес электронной почты и перечисляет всю информацию для каждого клиента. В настоящее время, если у клиента 10 просроченных книг, клиент получит 10 электронных писем на основе структуры таблицы, потому что каждый книжный кредит является отдельной записью.

Например:

Дорогой Джим Кэри: Следующая книга (s) обусловлены:

  1. Как исправить Автомобили
  2. Джеймс Бонд возвращается

ли есть способ, которым я могу отправить только одно электронное письмо для каждого клиента, но перечислить каждый элемент в письме. Например, перечислите все книги?

Пример из Fox: отправив электронное письмо, используя приведенную выше таблицу, Джим Кэри получит 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(); 
} 

} 
+1

В для каждого вместо того, чтобы делать SEND EMAIL Возьмите строку и сохранить сложением список книг. затем позвоните по электронной почте для отправки после того, как вы создали список книг, который у человека есть. – logixologist

+0

Хорошо, глядя на ваш код, который может не работать .... hmm – logixologist

ответ

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(); 
    } 

} 
+0

Я обновил вопрос с помощью таблицы образцов. Пробовал вашу рекомендацию, и она помещает всех пользователей в одно электронное письмо. Спасибо. – Asynchronous

+0

Извините, я неправильно понял вопрос. Я обновил ответ, чтобы отправить только одно письмо для каждого клиента. – Jason

+0

Это kool Jason: Я все еще получаю два отдельных почтовых содержания в книге. Это похоже на тело электронной почты, повторяющее его для каждой книги. Мой шаблон - всего лишь базовый HTML. Поэтому вместо того, чтобы иметь несколько тел электронной почты, я просто хочу перечислить, сроки, а также книги, причитающиеся и взятые по дате. * См. Обновление до вопроса. – Asynchronous

0

Используйте пример Джейсона Янга, но слегка модифицированный, чтобы отделять электронные письма для каждого другого клиента.

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());