通过循环发送邮件在同一地址发送多封邮件
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
我正在尝试向申请这份工作的候选人发送电子邮件,有时我有几百甚至几千封邮件要发送,所以代码会有所帮助。
这是我写的,但问题是邮件在同一个地址上被发送了多次(在某些地址上发送了一两次,有时甚至更多)。
下面代码的一些解释。代码读取活动工作数据库并选择尚未联系的候选人(数据库中的 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