es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enviar correo a través del bucle envía múltiples correos a la misma dirección.

Estoy tratando de enviar correos electrónicos a los candidatos que se postularon para el trabajo, a veces tengo cientos o incluso miles de correos para enviar, así que el código sería de ayuda.

Este es el que escribí, pero el problema es que el correo se envía varias veces a la misma dirección (en algunas direcciones una o dos veces e incluso más).

Un poco de explicación sobre el código a continuación. El código lee la base de datos de trabajo activa y selecciona los candidatos que no han sido contactados (columna FMZ en la base de datos, “X”), luego lee el ID único del candidato en otra base de datos para la dirección de correo electrónico a la que se enviará el correo. Incluso el msgbox básico debajo de “SmtpServer.Send(mail)” se activa solo una vez por cada candidato, pero el correo se envía varias veces.
Aquí está el código.

“`vb.net
'Step 1 – Todos los candidatos en DBAP que se postularon para ClientID / Job ID
For i As Integer = 0 To dsPoslovi.Tables(0).Rows.Count – 1
If dsPoslovi.Tables(0).Rows(i)(1).ToString() = ATS<em>IDKlijent AndAlso dsPoslovi.Tables(0).Rows(i)(2).ToString() = ATS</em>IDPosao Then
'Step 2 – Enviar correos a aquellos que aún no han sido contactados (X en la columna FMZ)
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()
'Leer direcciones de correo
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

<pre><code> MailKandidata = dsCL.Tables(0).Rows(x)(7).ToString()

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

'Actualizar base de datos de trabajo activa
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
</code></pre>

End If
“`

Siguiente
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el código no está registrando correctamente qué candidatos ya han sido contactados. Una solución podría ser crear una lista o array para almacenar los IDs de los candidatos que ya han recibido el correo electrónico, y luego verificar esa lista antes de enviar el correo electrónico nuevamente al mismo candidato. Por ejemplo:

    “`vb.net
    ‘crear una lista vacía para llevar el registro de los candidatos contactados
    Dim contactedCandidates As New List(Of String)

    ‘recorrer todos los candidatos en la base de datos
    For i As Integer = 0 To dsPoslovi.Tables(0).Rows.Count – 1
    ‘verificar si el candidato ha aplicado para el trabajo en cuestión
    If dsPoslovi.Tables(0).Rows(i)(1).ToString() = ATS_IDKlijent AndAlso dsPoslovi.Tables(0).Rows(i)(2).ToString() = ATS_IDPosao Then
    ‘verificar si el candidato aún no ha sido contactado
    If dsPoslovi.Tables(0).Rows(i)(8).ToString() <> “X” Then
    ‘obtener el ID y la dirección de correo electrónico del candidato
    IDKandidataAP = dsPoslovi.Tables(0).Rows(i)(0).ToString()
    IDKandidataAP2 = dsPoslovi.Tables(0).Rows(i)(3).ToString()
    For x As Integer = 0 To dsCL.Tables(0).Rows.Count – 1
    ‘si el ID del candidato coincide, obtener la dirección de correo electrónico
    If dsPoslovi.Tables(0).Rows(i)(3).ToString() = dsCL.Tables(0).Rows(x)(1).ToString() Then
    MailKandidata = dsCL.Tables(0).Rows(x)(7).ToString()
    ‘verificar si el candidato ya ha sido contactado
    If Not contactedCandidates.Contains(IDKandidataAP) AndAlso MailKandidata.Contains(“@”) Then
    ‘crear y enviar el correo electrónico
    SmtpServer.Send(mail)
    MsgBox(MailKandidata)
    ‘agregar el ID del candidato a la lista de candidatos contactados
    contactedCandidates.Add(IDKandidataAP)
    End If
    End If
    Next
    ‘actualizar la base de datos para marcar al candidato como contactado
    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
    “`

    Con esta modificación, se agrega el ID de cada candidato a la lista contactedCandidates después de enviar exitosamente el correo electrónico, y el código verifica contra esa lista antes de enviar un correo electrónico nuevamente al mismo candidato.

Comments are closed.