複数のウェブサイトのバックエンドとして管理システムがあり、この管理システムの一部は、個別または一括メールとしてユーザーにメールを送信できるメール システムです。
私は最近、電子メールのコードを書き直して、より堅牢にし、電子メールのステータスと発生したエラーを正しくログに記録するようにしました。
2000 人未満のユーザーに送信する電子メール コードを繰り返し (おそらく 20 回程度) 正常にテストしましたが、バックグラウンド スレッドで電子メール送信ルーチンを実行しようとするまでは、すべて正常に動作します。
私は2つの異なるスレッド化方法を試しました.どちらもスレッドをスレッドプールに追加します
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