【问题标题】:Remove To and BCC Addresses using System.Net.Mail使用 System.Net.Mail 删除收件人和密件抄送地址
【发布时间】:2015-01-23 21:27:15
【问题描述】:

我正在升级一个群发邮件应用程序以使用新的 System.Net.Mail 命名空间。我还在为文本和 HTML 版本设置 AlternateViews。

目前我正在使用 DataReader 从数据库中获取电子邮件地址并发送邮件。在旧代码中,我会在循环结束时清除 To 和 BCC 属性。

MailMessage mailMessage = new MailMessage();

while (dr.Read())
{
    ....
    mailMessage.To.Add(new MailAddress(dr["EmailAddress"].ToString()));

    if ((bool)dr["SecondaryNotify"])
        mailMessage.Bcc.Add(new MailAddress(dr["SecondaryEmail"].ToString()));

    // Send email
    ...
}

显然有一个可以在 MailMessage 类 mailMessage.To.Remove(MailAddress item) 的 To 属性上调用的 Remove 方法 - 我已经从智能感知中确定了这一点。我检查了 MSDN,找不到这种用法的示例。

任何人都可以协助语法删除循环的每次迭代的收件人和密件抄送地址 - 在每封电子邮件发送后?

【问题讨论】:

  • 那么你为什么要添加 To 和 BCC 字段,当你打算删除它们时。
  • 我已经向这些地址发送了电子邮件 - 我想为下一封电子邮件获取新地址。
  • 那么你应该将MailMessage mailMessage = new MailMessage();移动到while循环中,这样它就会为每次迭代创建新实例,而你不必删除/清除它们

标签: c# asp.net email webforms system.net.mail


【解决方案1】:

采用更简单的解决方案。只需在您的 while 循环中实例化 MailMessage 即可。那么你就不需要删除任何东西了。

while (dr.Read())
{
    var mailMessage = new MailMessage();
    ....
    mailMessage.To.Add(new MailAddress(dr["EmailAddress"].ToString()));

    if ((bool)dr["SecondaryNotify"])
        mailMessage.Bcc.Add(new MailAddress(dr["SecondaryEmail"].ToString()));

    // Send email
    ...
}

【讨论】:

  • 目前发送 2,000 多封电子邮件 - 每次都重新创建它没有性能问题?
  • 我怎么知道?我不会发送 2000 封电子邮件来测试它。你为什么要预先优化呢?编写它以使其正常运行,然后如果速度慢得令人无法接受,请返回并查看您的选择。我的猜测是,重新实例化对象带来的任何性能损失都比多次调用.Remove()(如果可能的话)要好。
  • 在现实世界中,尝试发送几百封邮件,看看会发生什么。你很快就会让你的老板联系控制结果的公司;-)
【解决方案2】:

我的一个代码中遇到了同样的问题...

试试这个:

MailMessage mailMessage = new MailMessage();

while (dr.Read())
{
//Your code from HERE
    mailMessage.To.Add(new MailAddress(dr["EmailAddress"].ToString()));

    if ((bool)dr["SecondaryNotify"])
        mailMessage.Bcc.Add(new MailAddress(dr["SecondaryEmail"].ToString()));

    // Send email
    ...
    //Then email delete from .To
    int iMessageInArray = mailMessage.To.Count(); //Finds the amount of emails in the array

    if(iMessageInArray > 0)
    {
       for(int i = 0; i < iMessageInArray; i++)
       {
           mailMessage.To.Remove(mailMessage.To[0]); //When one line is removed, the next email comes in index 0 of the array.
        }
    }
}

【讨论】:

    【解决方案3】:
        var adresse = dr["SecondaryEmail"].ToString();
        int iMessageInArray = mailMessage.To.Count();
        if(iMessageInArray > 0)
        {
            foreach (var mailadress in mailMessage.To)
            {
                if (mailadress.Address == adresse)
                {
                    mailMessage.To.Remove(mailadress);
                }
            }
        }
    

    【讨论】:

    • 我相信这段代码会出错。迭代时不能修改集合。
    猜你喜欢
    • 2018-04-07
    • 2013-12-22
    • 1970-01-01
    • 2014-12-27
    • 2011-11-20
    • 2015-12-19
    • 2018-09-18
    • 2016-12-19
    • 2013-10-08
    相关资源
    最近更新 更多