如何加快发送电子邮件?

时间:2013-10-24 14:35:09

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

我需要向不同的人发送不同的电子邮件。为每个收件人生成不同的电子邮件正文,然后我调用以下方法。也就是说,如果有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分钟(有时甚至更多)才能返回控制权并且标签的值更改为“发送的电子邮件”。可以做一些事情,以便用户只需点击按钮,发起电子邮件发送,他/她可以关闭窗口继续他的工作吗?

我现在正处于关键阶段,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

首先 - 不要让用户等待此操作。如果你需要等待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之类的东西来提醒浏览器。

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