0

複数のウェブサイトのバックエンドとして管理システムがあり、この管理システムの一部は、個別または一括メールとしてユーザーにメールを送信できるメール システムです。

私は最近、電子メールのコードを書き直して、より堅牢にし、電子メールのステータスと発生したエラーを正しくログに記録するようにしました。

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
4

0 に答える 0