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

Ban*_*njo 7 asp.net email smtp sendmail message-queue

我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)

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

Sae*_*ini 6

将电子邮件的排队与发送它们分离.例如:

  1. 为外发电子邮件创建数据库表,其中包含其发送日期的列.
  2. 每当您想要发送外发电子邮件时,请将其插入到具有NULL发送日期的表中.
  3. 让后台任务每X秒运行一次,以检查发送日期为NULL的电子邮件,尝试发送它们,并在成功时更新其发送日期.提示:为了在ASP.NET中对重复任务进行排队的简单方法,请查看此内容.

这是一个非常简单的简单示例,但您可以轻松扩展它.