我们有一个管理系统作为多个网站的后端,此管理系统的一部分是一个电子邮件系统,允许将电子邮件单独或作为批量电子邮件发送给用户。
我最近重新编写了电子邮件代码,以便更加强大并正确记录电子邮件状态以及发生的任何错误。
我们已经成功地测试了电子邮件代码(可能大约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