通过循环发送邮件在同一地址发送多封邮件

Sending mail through the loop sends multiple mails at same address

我正在尝试向申请这份工作的候选人发送电子邮件,有时我有几百甚至几千封邮件要发送,所以代码会有所帮助。

这是我写的,但问题是邮件在同一个地址上被发送了多次(在某些地址上发送了一两次,有时甚至更多)。

下面代码的一些解释。代码读取活动工作数据库并选择尚未联系的候选人(数据库中的 FMZ 列,“X”),然后在另一个数据库中读取候选人的唯一 ID,以获取将要发送邮件的电子邮件地址。即使 SmtpServer.Send(mail) 下面的基本 msgbox 也只为每个候选人激活一次,但邮件会被发送多次。 这是代码。

'Step 1 - All candidates in DBAP that applied for ClientID/Job ID
For i As Integer = 0 To dsPoslovi.Tables(0).Rows.Count - 1
    If dsPoslovi.Tables(0).Rows(i)(1).ToString() = ATS_IDKlijent AndAlso dsPoslovi.Tables(0).Rows(i)(2).ToString() = ATS_IDPosao Then
        'Step 2 - Send mails to those not contacted yet (X in FMZ column)
        If dsPoslovi.Tables(0).Rows(i)(8).ToString() <> "X" Then
            IDKandidataAP = dsPoslovi.Tables(0).Rows(i)(0).ToString()
            IDKandidataAP2 = dsPoslovi.Tables(0).Rows(i)(3).ToString()
            'Read mail addresses
            For x As Integer = 0 To dsCL.Tables(0).Rows.Count - 1
                If dsPoslovi.Tables(0).Rows(i)(3).ToString() = dsCL.Tables(0).Rows(x)(1).ToString() Then

                    MailKandidata = dsCL.Tables(0).Rows(x)(7).ToString()

                    If MailKandidata.Contains("@") = True Then
                        SmtpServer.Send(mail)
                        MsgBox(MailKandidata)
                    End If
                End If
            Next

            'Update active job database
            Dim cmd As New OleDbCommand(query, myCONN)
            myCONN.Open()
            cmd.Parameters.AddWithValue("FMZ", "X")
            cmd.Parameters.AddWithValue("ID", IDKandidataAP)

            cmd.ExecuteNonQuery()
            myCONN.Close()

        End If

    End If
Next

因为我不喜欢打字,所以我将 DataSet.Tables 解析为 DataTable 并遍历了 Rows 集合。对我来说,它更具可读性。

我认为问题出在 mail.To 集合中。每次迭代都会添加一个收件人并将电子邮件发送给每个收件人。我在循环内构建集合,在循环外只邮寄一次。邮件将发送给集合中的每个收件人。

我不确定 IDKandidataAP2 发生了什么。它似乎没有用在这个方法中,并且在每次迭代时都会被覆盖。

我更正了数据库代码。连接和命令应该在循环外的 Using 块中声明。我在循环外构建参数集合,只在循环内更改@ID 参数的值。我猜想 Update 字符串可能是什么样子。 Add 方法优于 AddWithValue 方法。我猜到了数据类型。检查您的数据库中的实际类型。

Private ATS_IDKlijent As String = "" '?
Private ATS_IDPosao As String = "" '?
Private dsCL As New DataSet
Private dsPoslovi As New DataSet
Private mail As New MailMessage
Private SmtpServer As New SmtpClient()
Private IDKandidataAP As String
Private IDKandidataAP2 As String

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dt As DataTable = dsPoslovi.Tables(0)
    'Step 1 - All candidates in DBAP that applied for ClientID/Job ID
    Dim query = "Update SomeTable Set FMZ = @FMZ Where ID = @ID;"
    Using myCONN As New OleDbConnection("Your connection string"),
            cmd As New OleDbCommand(query, myCONN)
        cmd.Parameters.Add("@FMZ", OleDbType.VarChar).Value = "X"
        cmd.Parameters.Add("@ID", OleDbType.VarChar)
        myCONN.Open()
        For Each row As DataRow In dt.Rows
            If row(1).ToString() = ATS_IDKlijent AndAlso row(2).ToString() = ATS_IDPosao Then
                'Step 2 - Send mails to those not contacted yet (X in FMZ column)
                If row(8).ToString() <> "X" Then
                    IDKandidataAP = row(0).ToString()
                    IDKandidataAP2 = row(3).ToString()
                    'Read mail addresses
                    Dim dt2 As DataTable = dsCL.Tables(0)
                    For Each row2 As DataRow In dt2.Rows
                        If row(3).ToString() = row2(1).ToString() Then
                            Dim MailKandidata = row2(7).ToString()
                            If MailKandidata.Contains("@") = True Then
                                Dim ToAddress As New MailAddress(MailKandidata)
                                mail.To.Add(ToAddress)
                                MsgBox(MailKandidata)
                            End If
                        End If
                    Next
                    'Update active job database
                    cmd.Parameters("@ID").Value = IDKandidataAP
                    cmd.ExecuteNonQuery()
                End If
            End If
        Next
    End Using 'Closes and disposes the connection and disposes the command.
    SmtpServer.Send(mail)
End Sub