【问题标题】:Iterate through checkboxes, send email and loop遍历复选框、发送电子邮件并循环
【发布时间】:2015-05-13 07:39:49
【问题描述】:

我们正在尝试一次向公司列表发送多封电子邮件,其中一封电子邮件可以被选中或取消选中。如果检查了电子邮件,则需要将其发送给他们。我已经设法让它将电子邮件发送到每个勾选的电子邮件地址,但我们希望它一次一个。 IE,而不是一次性向 Contact1、Contact2、Contact3 发送一封电子邮件,我们希望向 Contact1 发送一封电子邮件,循环然后再次向 Contact2 发送相同的电子邮件,依此类推。

尝试了一个 foreach 循环,但它只是将电子邮件发送给每个收件人 3 次,而不是一次发送给一个收件人,同时只在“收件人”字段中显示他们的电子邮件。

发送邮件的代码如下:

        var smtp = new SmtpClient
        {
            Host = "",
            Port = 25,
            EnableSsl = false,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = true,
        };

        //Set message details, ensuring HTML is displayed when sent
        using (var message = new MailMessage(fromAddress, toAddress)
        {
            Subject = subject,
            Body = body,
            IsBodyHtml = true,
            BodyEncoding = System.Text.Encoding.UTF8
        })
            //Try send the email to the users
            try
            {
                smtp.Send(message); //Send the message to selected users

                Response.Redirect("~/BulkEmail/Index"); //Redirect back to the Index page if send is successful.
            }
            catch
            {
                Response.Redirect("~/Home/Failure");
            }

这很好用,但由于它会发送到外部电子邮件,我们希望他们每次都收到一封。收集和“检查”电子邮件的视图如下:

@{
    string Email;
    Email = User.Identity.Name.Split('\\')[1] + "@email.email";
}
@{
    int count = 1;
}

@using (Html.BeginForm("SendEmail", "BulkEmail", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
<label>To:</label> @User.Identity.Name.Split('\\')[1]<br />
<label>From:</label> <input type="text" name="txtFrom" value="@Email" /><br />
<table border="1" width="100%">
<label>BCC:</label>@foreach (var item in Model)
                   {
    <tr width="100%">
        <td>
            @count
        </td>
        <td wdith="25">
            @Html.DisplayFor(modelItem => item.FirstName) @Html.DisplayFor(modelItem => item.LastName)
        </td>
        <td wdith="25">
            @Html.DisplayFor(modelItem => item.tblContact.Company)
        </td>
        <td wdith="25">
            @Html.DisplayFor(modelItem => item.Email)
        </td>
        <td wdith="25" align="center">
            <input type="checkbox" name="chkBox" value="@item.Email" checked="checked"/>
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.MailRecipientId }) |
            @Html.ActionLink("Details", "Details", new { id = item.MailRecipientId }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.MailRecipientId })
        </td>
    </tr>     
                       count += 1;
                   }
    </table><br />
<label>Subject:</label> <input type="text" name="txtSubject" value="Quotations Needed"/>
<textarea name="message"></textarea><br />
<input type="submit" value="BOOM THE EMAILS!" />
}
@Html.Action("TinyMCE", "Include")

任何帮助将不胜感激。我觉得它应该是一个 foreach 循环,但我不能 100% 确定如何在这个特定实例中正确实现它。

谢谢

请求的代码:

            var fromName = @User.Identity.Name.Split('\\')[1];
        var fromAddress = Request.Form["txtFrom"];
        var toAddress = Request.Form["chkBox"];
        var subject = Request.Form["txtSubject"];
        var q = Request.Unvalidated.Form;
        var messageBody = q["message"];

控制器更新

public ActionResult SendEmail()
    {

        //Create variables for where the message is going internally, setting the subject and body whilst allowing an unvalidated HTML tinyMCE box to be posted.
        var fromName = @User.Identity.Name.Split('\\')[1];
        var fromAddress = Request.Form["txtFrom"];
        var toAddress = Request.Form["chkBox[]"];
        var subject = Request.Form["txtSubject"];
        var q = Request.Unvalidated.Form;
        var messageBody = q["message"];

        String body = messageBody;

        MailMessage mail_client = new MailMessage();
        int index = 0;
        foreach (var email in toAddress)
        {
            mail_client.To.Add(chkBox[index]);
            index++;
        }
        mail_client.From = new MailAddress(fromAddress);
        mail_client.Subject = subject;
        mail_client.IsBodyHtml = true;
        mail_client.Body = body;


        {
            //Create new SMTP client and give server details
            var smtp = new SmtpClient
            {
                Host = "",
                Port = 25,
                EnableSsl = false,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                UseDefaultCredentials = true,
            };

            //Set message details, ensuring HTML can be displayed when sent
            using (var message = new MailMessage(fromAddress, toAddress)
            {
                Subject = subject,
                Body = body,
                IsBodyHtml = true,
                BodyEncoding = System.Text.Encoding.UTF8
            })
                //Try send the email to the users
                try
                {
                    smtp.Send(message); //Send the message to selected users

                    Response.Redirect("~/BulkEmail/Index"); //Redirect back to the Index page if send is successful.
                }
                //If the email doesn't send, allow the page to redirect rather than giving a vile error!
                catch
                {
                    Response.Redirect("~/Home/Failure");
                }

        }
        return View();
    }

【问题讨论】:

  • 显示您检查检查列表的代码并将地址添加到To
  • @Sachu 我已将代码的“toAddress”区域添加到主帖中。然后在原始帖子的第二个代码块中使用它

标签: c# asp.net email loops foreach


【解决方案1】:

将 chkbox 的名称更改为“chkbox[]” 所以在控制器中你会得到一个参数(string[] chkbox),它只包含选中的参数..

然后创建一个邮件消息对象

MailMessage mail_client = new MailMessage();
 int index = 0
  foreach (string email in chkbox)
   {
   mail_client.To.Add(chkbox[index]);  
    index++;
   }

mail_client.From = new MailAddress("");
mail_client.Subject = subject;
mail_client.IsBodyHtml = true;
mail_client.Body = body;

smtp.Host = "";
smtp.Port = ;
smtp.UseDefaultCredentials = true;
smtp.Send(mail_client);

然后你可以用它来发送邮件

【讨论】:

    【解决方案2】:

    将您要发送的所有电子邮件地址添加到数组中,例如:

    //Email Address
    List<string> recipients= new List<string>();
    recipients.Add("Email1");
    recipients.Add("Email2");
    recipients.Add("Email3");
    recipients.Add("Email4");
    recipients.Add("Email5");
    

    然后像这样做一个for循环:

    for (int i = 0; i < recipients.Count; i++)
    {
        System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
        message.IsBodyHtml = true;
        message.To.Add(recipients[i]);
        message.Subject = subject;
        message.From = from;
        message.Body = body;
        System.Net.Mail.SmtpClient smtp = smtpClient;
        smtp.Send(message);
    }
    

    【讨论】:

    • 电子邮件是从数据库中读取的,因此将每封电子邮件添加到数组中意味着它们是硬编码的,不是吗?
    • 您仍然可以使用选择查询将它们添加到数据库中的数组中。什么样的数据库?
    • 好的,那么如何使用select distinct emailAddress from tablename 将SQL 数据源添加到.aspx 页面。使用该数据源来填充隐藏的下拉列表并使用它来填充数组。试图让它变得简单,但有 100 种不同的方法可以做到这一点
    • 你能在 razorview 页面中使用 SQL 吗(忘了说这是我们正在使用的,抱歉)。一直在尝试找到使用它而不是 LINQ 的方法,但找不到它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多