none
Como enviar correo a multiples cuentas cargadas en un gridView RRS feed

  • Pregunta

  • Hola

    Tengo el siguiente Grid:

        GridView ID="gridCoor" runat="server" CssClass="mGrid" AutoGenerateColumns="False">
                                    <columns>
                                        <asp:TemplateField>
                                            <HeaderTemplate>
                                                <asp:CheckBox ID="chkHeader" runat="server" onclick="checkAll(this);" />
                                            </HeaderTemplate>
                                            <ItemTemplate>
                                                <asp:CheckBox ID="CheckBox1" runat="server" onclick="Check_Click(this)" />
                                            </ItemTemplate>
                                        </asp:TemplateField>                                    
                                        <asp:BoundField DataField="CODIGO_REPORTE" HeaderText="CODIGO_REPORTE" SortExpression="CODIGO_REPORTE" />
                                        <asp:BoundField DataField="FECHA_REGISTRO" HeaderText="FECHA_REGISTRO" SortExpression="FECHA_REGISTRO" />
                                        <asp:BoundField DataField="EMPLEADO" HeaderText="EMPLEADO" SortExpression="EMPLEADO" />
                                    <asp:BoundField DataField="CORREO_PM" HeaderText="CORREO_PM" SortExpression="CORREO_PM" />
                                </columns>
                                </asp:GridView>

    Se requiere que al momento de acualizar los registros se envíe un correo a cada una de las cuentas que aparezcan en la columna CORREO_PM cada vez que se actualicen los datos.

    Para actualizar los datos utilizo el siguiente código:

        For Each row As GridViewRow In gridCoor.Rows
                    If TryCast(row.FindControl("CheckBox1"), CheckBox).Checked Then
                        traer = usu.Get_ID_HORAS(Convert.ToInt32(row.Cells(1).Text))
                        If traer.Rows.Count > 0 Then
                            usu.UpdateAprCoor(DateTime.Now, dropUpdate.SelectedValue, txtBoservaciones.Text, Convert.ToInt32(row.Cells(1).Text))
                        Else
                            ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertMessage", "alert('Información Invalida');", True)
                        End If
                    Else
                        ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertMessage", "alert('Por favor SELECCIONE ');", True)
                    End If
                Next
                    End If




    Respuesta de foro Microsoft


    • Editado yulfredy miércoles, 6 de septiembre de 2017 1:13
    miércoles, 6 de septiembre de 2017 1:12

Respuestas

  • Así a simple vista, lo más grave que salta a la vista es que haces "para=Convert.ToInt32(...)". ¿Por qué conviertes a número entero el destinatario del correo? Esto tiene que fallar siempre, salvo que todos tus buzones de correo consistan simplemente en un número, sin ninguna letra.

    Eso lógicamente lanzará una excepción al hacer la conversión. Pero como has puesto un "Catch" vacío, no te enteras de que la excepción ha ocurrido, con lo que el programa falla silenciosamente sin que te enteres de por qué ha fallado. Acostúmbrate a no poner nunca un Try...Catch con el Catch vacío. Siempre hay que poner algo en el Catch para que la excepción no pase desapercibida (bueno, puede haber algunos casos muy excepcionales en los que esté justificado despreciar la excepción; en estos casos, hay que escribir y explicar la justificación en un comentario dentro del Catch).

    • Marcado como respuesta yulfredy miércoles, 6 de septiembre de 2017 13:26
    miércoles, 6 de septiembre de 2017 10:08

Todas las respuestas

  • Primero crea el objeto MailMessage antes de meterte en el "For Each row", y luego dentro del "If traer.Rows.Count > 0 Then" tomas el campo del grid que contiene el correo, y lo añades a la colección de destinatarios del MailMessage. Y luego a la salida del bucle ya haces el Send(...) para enviar el mensaje.

    Eso hará que se envíe un único mensaje a todos los correos que hayas tomado del grid. Si quieres enviar un mensaje por separado a cada uno de ellos, entonces es más sencillo: basta con que dentro del "If" construyas el MailMessage y le hagas el Send ahí mismo.

    • Propuesto como respuesta Jorge TurradoMVP miércoles, 6 de septiembre de 2017 6:47
    miércoles, 6 de septiembre de 2017 6:45
  • Hola

    Lo estoy haciendo de esta manera pero no me funciona:

          For Each row As GridViewRow In gridCoor.Rows
                    If TryCast(row.FindControl("CheckBox1"), CheckBox).Checked Then
                        traer = usu.Get_ID_HORAS(Convert.ToInt32(row.Cells(1).Text))
                        If traer.Rows.Count > 0 Then
                            usu.UpdateAprCoor(DateTime.Now, dropUpdate.SelectedValue, txtBoservaciones.Text, Convert.ToInt32(row.Cells(1).Text))
                            Try
                                para = Convert.ToInt32(row.Cells(4).Text)
                                asunto = "Modificación"
                                mensaje = "Se ha modificado su registro"
                                mail.[To].Add(New MailAddress(Me.para))
                                mail.From = New MailAddress("portalmv@dominio.com")
                                mail.Subject = asunto
                                mail.Body = mensaje
                                Dim cliente As New SmtpClient("9.8.9.9", 25)
                                Using cliente
                                    cliente.Credentials = New System.Net.NetworkCredential("portalmv@dominio.com", "C0l0mb14*")
                                    cliente.EnableSsl = False
                                    cliente.Send(mail)
                                End Using
                            Catch ex As Exception
    
                            End Try
                        Else
                            ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertMessage", "alert('Información Invalida');", True)
                        End If
                    Else
                        ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertMessage", "alert('Por favor SELECCIONE ');", True)
                    End If
                Next


    Respuesta de foro Microsoft

    miércoles, 6 de septiembre de 2017 9:41
  • Así a simple vista, lo más grave que salta a la vista es que haces "para=Convert.ToInt32(...)". ¿Por qué conviertes a número entero el destinatario del correo? Esto tiene que fallar siempre, salvo que todos tus buzones de correo consistan simplemente en un número, sin ninguna letra.

    Eso lógicamente lanzará una excepción al hacer la conversión. Pero como has puesto un "Catch" vacío, no te enteras de que la excepción ha ocurrido, con lo que el programa falla silenciosamente sin que te enteres de por qué ha fallado. Acostúmbrate a no poner nunca un Try...Catch con el Catch vacío. Siempre hay que poner algo en el Catch para que la excepción no pase desapercibida (bueno, puede haber algunos casos muy excepcionales en los que esté justificado despreciar la excepción; en estos casos, hay que escribir y explicar la justificación en un comentario dentro del Catch).

    • Marcado como respuesta yulfredy miércoles, 6 de septiembre de 2017 13:26
    miércoles, 6 de septiembre de 2017 10:08
  • Claro,

    la columna (1) es int por que es el Id con el que actualizo los registros, la otra columna es string la cual contiene el correo.

    Muchas gracias!!!!


    Respuesta de foro Microsoft

    miércoles, 6 de septiembre de 2017 13:29
  • Alberto Poblacion

    Finalmente

    Al tratar de incluir el CODIGO_REPORTE en cada correo está incluyendo el ultimo CODIGO_REPORTE a todos los correos.

    Lo estoy haciendo de esta manera:

    For Each row As GridViewRow In gridCoor.Rows
                        If TryCast(row.FindControl("CheckBox1"), CheckBox).Checked Then
                            traer = usu.Get_ID_HORAS(Convert.ToInt32(row.Cells(1).Text))
                            If traer.Rows.Count > 0 Then
                                usu.UpdateAprCoor(DateTime.Now, dropUpdate.SelectedValue, txtBoservaciones.Text, "APROBADO", Convert.ToInt32(row.Cells(1).Text))
                                Try
                                   
                                    para = row.Cells(4).Text
                                    asunto = "Modificaciónes"
                                    mensaje = "Se ha modificado el reporte : " + row.Cells(1).Text+ " "
                                    mail.[To].Add(New MailAddress(Me.para))
                                    mail.From = New MailAddress("portalmv@dominio.com")
                                    mail.Subject = asunto
                                    mail.Body = mensaje
    
                                Catch ex As Exception
                                    ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertMessage", "alert('EROR');", True)
                                End Try
                            Else
                                ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertMessage", "alert('Información Invalida');", True)
                            End If
                        Else
                            ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertMessage", "alert('Por favor SELECCIONE ');", True)
                        End If
                    Next
    
                    Dim cliente As New SmtpClient("9.2.2.2", 25)
                    Using cliente
                        cliente.Credentials = New System.Net.NetworkCredential("portalmv@dominio.com", "C0l0mb14*")
                        cliente.EnableSsl = False
                        cliente.Send(mail)

    Me podrias orientar por favor como hacer que envie a cada correo los codigos actualizados correspondiente a cada correo?

    Mil gracias..


    Respuesta de foro Microsoft

    miércoles, 6 de septiembre de 2017 15:06
  • Fíjate que estás construyendo el mensaje DENTRO del bucle, y luego lo estás enviando FUERA del bucle. Esto implica que se enviará un correo con el último contenido que obtuvo el bucle, y todos los demás no se enviarán (solo los construyes pero no los envías). Remedio: Mete el envío del mensaje DENTRO del bucle, justo después de preparar el mensaje.
    miércoles, 6 de septiembre de 2017 17:07