0

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

我最近重新编写了电子邮件代码,使其更加健壮并正确记录电子邮件状态和发生的任何错误。

我们已经成功地反复测试了电子邮件代码(可能大约 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
4

0 回答 0