【问题标题】:How to speed up sending of e-mails?如何加快电子邮件的发送速度?
【发布时间】:2013-10-24 14:35:08
【问题描述】:

我需要向不同的人发送不同的电子邮件。为每个收件人生成不同的电子邮件正文,然后我调用以下方法。即如果有10个收件人,则调用以下方法10次:

        public int Send_Mail(string send_from_bc, string send_to_bc, string subject_bc, string body_bc)
        {
            try
            {
                int count_returned = 0;
                var send_from = new MailAddress(send_from_bc, "The Admin");
                var send_to = new MailAddress(send_to_bc);
                string subject = subject_bc;
                string body = body_bc;

                var smtp = new SmtpClient
                {
                    Host = "**my smtp host**",
                    Port = 25,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    Timeout = 300000
                };

                using (var message = new MailMessage(send_from, send_to)
                {
                    Subject = subject,
                    Body = body
                })
                {
                    message.IsBodyHtml = true;
                    smtp.Send(message);
                    count_returned += 1;
                }

                return count_returned;
            }
            catch (Exception ex)
            {
                throw new Exception("Exception caught in Send_Mail", ex);
            }
        }

问题在于,即使发送几封邮件(如 10 或 15 封邮件),也要花费大量时间。发送一封邮件大约需要 2-5 分钟。现在,我确实相信部分提供给我的 SMTP 主机有问题。但是我能做些什么来加快速度呢?

另外,有没有办法实现这一点:现在,用户点击一个按钮,然后说,为了发送两封邮件,他/她必须等待 2-5 分钟(有时甚至更长时间)才能返回控制权并且标签的值更改为“已发送的电子邮件”。是否可以做一些事情,使用户只需单击按钮,并启动电子邮件发送,然后他/她可以关闭窗口并继续他的工作?

我现在处于关键阶段,我们将不胜感激。

【问题讨论】:

  • 嗯.. SMTP 服务器不在我的控制范围内。不过,我会尝试找出它有什么问题。我还能做些什么来优化我的代码以发送多封电子邮件??
  • 如果您要发送多封邮件,最好让您的connection 在所有电子邮件中保持打开状态。话虽如此,我看不到您的连接是从哪里开始初始化的。
  • 嗯..谢谢'。此处不需要该 connection.Close() 部分。我在我的代码中删除了它。顺便说一句,通过不为每封邮件创建新的 SmtpClient 对象,我将发送邮件所需的时间从大约 2-5 分钟减少到 30-40 秒。现在,我创建它一次并为每封邮件使用相同的对象。现在,无论我发送 1 封邮件还是 10 封邮件,都需要 30-40 秒。所以我猜现在这一切都归结为 SMTP 服务器了..
  • 所以现在我将按照 Ian 的建议尝试异步任务。关于如何优化我的代码以进行多邮件发送还有其他想法吗??

标签: c# asp.net .net email smtpclient


【解决方案1】:

第一件事 - 不要让用户等待此操作。如果您必须等待 2-5 分钟,会话很可能会超时。而是将此操作设为在后台运行的异步任务。

然后我会考虑弹出一个通知,说明电子邮件已稍后发送给用户,而不是强迫他们等待。

10 人的初学者 - 将您的发送电子邮件代码移到单独的类中:

public class EmailSender
{
    public EmailSender(/* Parameters required, e.g. list of emails */)
    { }

    public void SendEmails()
    {
        // Long running task
    }       
}

然后在你的页面中,说一个按钮被点击:

protected void btn_SendEmails_Clicked(object sender, EventArgs e)
{
     EmailSender emailSender = new EmailSender(/* Any setup code required */);
     ThreadPool.QueueUserWorkItem(emails  => emailSender.SendEmails());
}

要处理返回给用户的通知,您需要在电子邮件完成后引发一个事件,并可能使用 SignalR 之类的东西来提醒浏览器。

请注意,我没有尝试编译此代码,但应该会给您大致的想法。

【讨论】:

  • 你能告诉我如何开始吗?这是我正在创建的 Web 应用程序...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多