在后台进程中发送电子邮件

Send Email in background process

本文关键字:电子邮件 后台进程      更新时间:2023-09-26

我有以下代码,用于打开一个页面,并使用附加的证书向在课堂会话中注册的学生发送电子邮件,生成电子邮件和证书都在不同的 aspx 页面中工作。现在,我想生成相同的过程,而无需用户等待所有电子邮件发送完毕,我将在此过程中添加其他代码以在有任何问题时通知我。谁能指出我实现这一目标的正确方向。我已经阅读了几个论坛,但大多数情况下我发现 Windows 服务是一种选择 IMO 它有点过杀了。我感谢任何建议

提前感谢,

Protected Sub lbEmailOLetter_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbEmailOLetter.Click

       Dim id As Integer
        id = hfSessionID.Value
        If id > 0 Then

            Try
                HttpContext.Current.Server.Execute("Email.aspx?SessID=" & id, False)
                HttpContext.Current.ApplicationInstance.CompleteRequest()

            Catch ex As Exception
                lMessage.Text = "Could not send email with attachment."
            End Try
        Else
            lMessage.Text = "Must create and save a session in order send letter by email."
        End If
    End Sub

您可以在服务器上运行一个单独的服务,您可以在其中发送要在队列中发送的邮件的电子邮件 ID,以便该服务将异步处理该过程。

查看 Task.Factory 以将此任务拆分到另一个线程中

例那里有 vbsamples

您应该查看 .Net 中的生产者/使用者模式,特别是在使用任务并行库时。

我建议使用一个共享(静态)BlockingCollectionbc)容器,对电子邮件(mailItem)的内容进行建模,由默认ConcurrentQueue支持。

启动应用程序期间,例如在Application.Start global.asax中,放置当前Email.aspx页面用于发送电子邮件的代码,但它只是循环浏览排队的邮件项目(如果目前没有,它将阻止)。

后台工作线程将如下所示:

For Each mailItem In bc.GetConsumingEnumerable()
  ... send mail (Code from `Email.aspx`)
Next

然后在需要排队要发送的电子邮件的页面上:

Dim mailItem as new MailItem()
mailItem.To = "mickey@mouse.com"
mailItem.Subject = ...
bc.Add(mailItem)

当每个邮件项目被放入队列时,后台线程将处理它。