如何在ASP.NET中创建电子邮件队列机制如果网络出现故障?

时间:2015-08-25 04:58:14

标签: asp.net email smtp message-queue sendmail

我正在使用ASP.NET开发一个网站。我在那里向用户发送电子邮件。

目前我正在使用此代码向用户异步发送电子邮件。电子邮件正在后台发送。

public static void SendEmail(string Path, string EmailTo)
{
    Thread emailThread = new Thread(delegate()
    {
        try
        {
            string body = string.Empty;
            using (StreamReader reader = new StreamReader(Path))
            {
                body = reader.ReadToEnd();
            }
            MailMessage mail = new MailMessage();

            mail.From = new MailAddress("test@test.com");
            mail.To.Add(EmailTo);
            mail.Subject = "Test email";
            mail.Body += body;
            mail.IsBodyHtml = true;

            SmtpClient smtpClient = new SmtpClient("smtp.test.com");            
            smtpClient.Port = 587;
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtpClient.UseDefaultCredentials = false;
            smtpClient.Credentials = new System.Net.NetworkCredential("test@test.com", "test");
            smtpClient.EnableSsl = true;

            smtpClient.SendCompleted += (s, e) =>
            {
                smtpClient.Dispose();
                mail.Dispose();
            };
            try
            {
                smtpClient.Send(mail);
            }
            catch (Exception ex) { /* exception handling code here */ }
        }
        catch (Exception)
        {

            throw;
        }
    });
    emailThread.IsBackground = true;
    emailThread.Start();
}

所以上面的代码工作正常。但有一天我遇到了问题。当我同时按下发送按钮时,我的互联网连接断开了。所以电子邮件没有被解雇。那时我意识到这个电子邮件功能需要一些机制来排队电子邮件并根据队列中的顺序逐个发送给用户。因此,如果任何电子邮件未送达或网络停止,则重试它。那么如何实现这种机制呢?

1 个答案:

答案 0 :(得分:5)

将电子邮件排队发送去除。 e.g:

  1. 为外发电子邮件创建一个数据库表,其中包含发送日期列。
  2. 每当您想发送外发电子邮件时,请将其插入带有NULL发送日期的表中。
  3. 每X秒运行一次后台任务,以检查发送日期为NULL的电子邮件,尝试发送它们,并在成功时更新其发送日期。提示:有关在ASP.NET中对重复任务进行排队的简便方法,请查看this
  4. 这是一个非常剥离的简单示例,但您可以轻松扩展它。