0

このテーブルのデモ ユーザーに HTML 電子メールを送信するために、以下のプログラムを作成しました。

ここに画像の説明を入力

メールを 1 通だけ送信し、各顧客のすべての情報を一覧表示したいと考えています。現在、顧客が 10 冊の本の期限を過ぎている場合、顧客はテーブル構造に基づいて 10 通の電子メールを受け取ります。これは、書籍の貸し出しが個別のレコードであるためです。

例えば:

親愛なる Jim Carey: 次の本が期限切れです:

  1. 車の修理方法
  2. ジェームズ・ボンドが帰ってくる

顧客ごとに 1 つの電子メールのみを送信し、各項目を電子メールに記載する方法はありますか? たとえば、期限が切れているすべての本をリストしますか?

Fox の例: 上記の表を使用してメールを送信すると、Jim Carey は 1 通ではなく 2 通のメールを受け取ります。

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

}
4

2 に答える 2

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

}
于 2013-11-02T01:22:22.390 に答える