使用线程进程发送电子邮件

时间:2012-05-15 08:27:40

标签: asp.net vb.net multithreading email

我们有一个管理系统作为多个网站的后端,此管理系统的一部分是一个电子邮件系统,允许将电子邮件单独或作为批量电子邮件发送给用户。

我最近重新编写了电子邮件代码,以便更加强大并正确记录电子邮件状态以及发生的任何错误。

我们已经成功地测试了电子邮件代码(可能大约20次),发送到2000以下的用户,这一切都正常,直到我尝试在后台线程中运行电子邮件发送例程。

我尝试了两种不同的线程方法,都使用

将线程添加到线程池中
Threading.ThreadPool.QueueUserWorkItem(AddressOf SendEmails, emailThread)

使用

创建新主题
Dim t As New Threading.Thread(New Threading.ParameterizedThreadStart(AddressOf SendEmails))
t.Start(emailThread)

(注意:我刚刚开始为这个项目使用线程,所以如果我遗漏了一些明显的东西,请指出它)

有时,所有电子邮件都会发送正常,有时,电子邮件代码会在600或900封电子邮件后停止。它总是600或900,这是让我感到困惑的第一件事。

出于测试目的,我发送给1841位用户,电子邮件例程大约需要75分钟才能完成。

我已经将线程暂停到电子邮件例程中,因为我们在大约600封邮件之后开始遭遇被拒绝的收件人失败,可能是由于邮件服务器上的一些反垃圾邮件设置,但暂停10分钟然后继续解决这个问题。

那么,有没有人知道为什么在发送600或900封电子邮件之后,电子邮件发送似乎会停止工作?没有生成错误,它只是停止运行代码。

修改

根据要求,SendEmail函数的代码:

Private Sub SendEmails(ByVal vars As EmailThreading)
        Try
            For Each user As OD.RegisteredUser In Users
                Dim email As New OD.Email(vars.Site.SiteID)

                If String.IsNullOrEmpty(vars.Site.CommunicationBCCAddress) Then
                    email.BCCAddress = Me.txtEmailBCC.Text
                Else
                    email.BCCAddress = String.Format("{0};{1}", Me.txtEmailBCC.Text, vars.Site.CommunicationBCCAddress)
                End If

                ' basically, if there're items in the drop down list, then one 
                ' of them will have been used, so we grab the details from there
                If Me.ddlReplyFrom.Items.Count > 0 Then
                    email.From = fromAddresses.Item(Me.ddlReplyFrom.SelectedValue)
                Else
                    email.From = fromAddresses.Item(0)
                End If

                email.Body = txtEmailText.Text

                If Not vars.Comment Is Nothing AndAlso vars.Comment.CommentID > 0 Then
                    email.Body += String.Format("<br />-------------------------------------------------------<br /><br />This message was sent in response to:<br /><br />{0}<br /><br />Sent: {1}", _comment.Comment, _comment.DateAdded)
                End If


                email.Subject = Me.txtEmailSubject.Text

                email.CCAddress = txtEmailCC.Text
                email.ToAddress = user.EmailAddress
                email.EmailRecipientID = user.UserID
                email.AddAttachments(EmailAttachments)

                If vars.GroupEmail Then
                    email.GroupEmail = True
                    email.GroupEmailID = vars.GroupEmailID
                End If

                email.ContactType = _contactType

                email.UserType = user.RegisteredUserType

                email.Send()

                For Each ODFile As OD.File In vars.Files
                    ODFile.SaveForEmail(email.EmailID)
                    ODFile.SaveForContactLog(email.ContactLogID)
                Next

            Next
        Catch ex As Exception
            ErrorLog.LogError(ex.Message, "Email send routine", ex.ToString(), OD_Site.SiteID)
        End Try
    End Sub

0 个答案:

没有答案