在后台发送批量邮件
本文关键字:后台 | 更新日期: 2023-09-27 17:58:14
我在页面加载时调用了主页面的线程,并调用了EMail函数,如下所示:
Page_load()
{
CreatingThread();
}
protected void CreatingThread()
{
Thread tSendMails;
tSendMails = new System.Threading.Thread(delegate() { EmailQueueSettings(); });
tSendMails.IsBackground = true;
tSendMails.Start();
}
protected void EmailQueueSettings()
{
// Function to get emails which are not sent ;
// looping it and sending it one by one
// Function to send mails
// Updating the status after mail is sent
}
邮件正在发送,但多次发送给同一用户。
下次加载页面时,是否可以分配不同的线程和不同的邮件?
实际上,请重新阅读您的请求和评论。我想我误解了你的要求。我的假设是,你希望它能在页面加载上运行,并在与用户不同的线程中运行。但你想要的是,在web应用程序的后台不断运行一些东西,对吗?
一般来说,我会在后台使用控制台应用程序来完成这项工作。但是,您可以在global.asax Application_Start
方法中执行类似的操作。
void Application_Start(object sender, EventArgs e)
{
Task beginSendEmailTask = new Task(SendEmailRunningTask);
beginSendEmailTask.Start();
}
void SendEmailRunningTask()
{
while (true)
{
Thread.Sleep(300000); // 5minutes
MailMessage[] emails = GetEmailsToSend();
SmtpClient client = new SmtpClient(); // Configure this
foreach (MailMessage email in emails)
{
client.Send(email);
// Mark email in your database/application as sent.
}
}
}
不要忘记将电子邮件标记为已发送,无论您将其存储在何处。这可能就是您多次发送它们的原因。这也可能是因为它在每次母版页加载时都在运行。
编辑:解释
网站启动任务创建新线程任务进入循环
任务等待5分钟
GetEmailsToSend()查找要发送的100封电子邮件中的前50封
迭代并发送电子邮件
任务等待5分钟
GetEmailsToSend()查找接下来要发送的100封电子邮件中的50封
迭代并发送电子邮件
任务等待5分钟
GetEmailsToSend()未找到任何电子邮件
任务等待5分钟
GetEmailsToSend()查找2封新电子邮件
迭代并发送电子邮件