Отправка нескольких электронных писем с установленным флажком в gridview не работает

#c# #email #gridview #checkbox

#c# #Адрес электронной почты #gridview #флажок

Вопрос:

Я хотел бы получить некоторую помощь в решении следующей проблемы. Я пытаюсь отправлять электронные письма пользователям, которые отмечены в gridview. Я поискал вокруг и нашел много похожих тем, но я не смог найти рабочее решение. Ну, я знаю, что мне чего-то не хватает, возможно, в моем операторе выбора. Но я не могу в этом разобраться.

Мой код показывает gridview, скажем, с двумя пользователями, множеством элементов и адресами электронной почты от пользователей. Я выбрал по 1 элементу для каждого пользователя, поэтому следует отправить 2 электронных письма. отправляются 2 письма, но только на 1 адрес электронной почты, адрес электронной почты, который он встречает первым в базе данных. Я пытался выполнить поиск по идентификатору пользователя, но не смог заставить это работать, я все еще в первые несколько месяцев разработки в .net.

Смотрите здесь мой код:

     public void Email()
    {
        string conn = "Data Source=pc-...";
        LabelSendGridAbove.Text = "<b>Title</b><br /><br /> Text... <br /><br /> ";

        LabelSendGridBetween.Text = "<br /><br /> More text. "  
             "<br /><br /><br /> Regards, <br /><br /> " ;

        LabelSendGridUnder.Text = "<br /><br />--------------------------------------";


        System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection(conn);
        sqlConn.Open();
        SqlCommand sendGrid =
            new SqlCommand("SELECT statement for gridview which will be send in the email ", sqlConn);

        GridView grd = new GridView();

        // Css for the gridview which will be send in mail     
        grd.BorderStyle = System.Web.UI.WebControls.BorderStyle.None;
        grd.GridLines = GridLines.None;
        grd.RowStyle.HorizontalAlign = HorizontalAlign.Center;
        grd.Width = 600;

        foreach (DataControlField field in grd.Columns)
        {
            field.ItemStyle.Width = Unit.Percentage(100 / grd.Columns.Count);
        }

        if (sendGrid != null)
        {
            grd.DataSource = sendGrid.ExecuteReader();
            grd.DataBind();
        }

        StringBuilder sb = new StringBuilder();

        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter htw = new HtmlTextWriter(sw);
        grd.RenderControl(htw);

        sqlConn.Close();


        foreach (GridViewRow r in GridViewOrder.Rows)
        {
            if (((CheckBox)r.Cells[0].FindControl("CheckBoxGetProduct")).Checked == true )
            {
                System.Data.SqlClient.SqlConnection sqlConn3 = new System.Data.SqlClient.SqlConnection(conn);
                sqlConn3.Open();

                    if (((Label)r.Cells[0].FindControl("LabelEmailUsr")) != null)
                    {
                        Label txtUser = (Label)GridViewOrder.FindControl("LabelEmailUsr");
                        if (txtUser != null)
                        {
                            LabelTestMail.Visible = true;
                            LabelTestMail.Text = txtUser.Text.ToString();
                        }

                        SqlCommand emailAdres = new SqlCommand("SELECT tblUsers.tUserEmail FROM tblUsers", sqlConn3);

                        GridViewOrder.DataBind();

                        string email = Convert.ToString(emailAdres.ExecuteScalar());
                        LabelTestMail.Text = email;

                        try
                        {
                            MailMessage mail = new MailMessage();
                            mail.To.Add(email.ToString());
                            mail.Bcc.Add("SomeEmail");
                            mail.From = new MailAddress("FromWho");
                            mail.Subject = "SomeSubject";
                            string Body = LabelSendGridAbove.Text   sb.ToString()   LabelSendGridBetween.Text   "<br /><img alt="" hspace=0 src="cid:imageId" align=baseline border=0 >"   LabelSendGridUnder.Text   "<BR>";

                            AlternateView htmlView = AlternateView.CreateAlternateViewFromString(Body, null, "text/html");
                            LinkedResource imagelink = new LinkedResource(Server.MapPath(".")   @"logoLogo.jpg");
                            imagelink.ContentId = "imageId";
                            imagelink.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
                            htmlView.LinkedResources.Add(imagelink);
                            mail.AlternateViews.Add(htmlView);
                            SmtpClient smtp = new SmtpClient("relay.skynet.be");
                            smtp.Send(mail);
                        }
                        catch (Exception ex)
                        {
                            Response.Write(ex.Message);
                        }
                    }
            }              
      }
  } 
  

Я надеюсь, что в этом коде не слишком много ошибок. Но если кто-нибудь знает, что я должен добавить в код, чтобы заставить его работать, чтобы он отправлял 2 электронных письма на 2 разных адреса электронной почты, что было бы очень приятно.

Спасибо.

Комментарии:

1. Я изменил код, чтобы он имел больше смысла. Хотя проблема все та же.

Ответ №1:

Если я правильно понимаю, отправляются два письма, но только на один адрес … первый адрес из DB…am Я прав?

Если это так, то проблемная строка

 SqlCommand emailAdres = new SqlCommand("SELECT tblUsers.tUserEmail FROM tblUsers", sqlConn3); 
  

Мне кажется, что вы вызываете один и тот же адрес электронной почты на каждой итерации for…каждый цикл. Попробуйте добавить предложение where и параметр поиска.

Комментарии:

1. Здравствуйте, спасибо за ваш ответ. Я попытался добавить предложение where, но мне трудно написать правильный код. На данный момент это выглядит так: Label lblUsrId = (Label)GridViewOrder.FindControl("LabelId"); SqlCommand emailAdres = new SqlCommand("SELECT tblGebruikers.tUsrId, tblUsers.tUsrEmail " "FROM tblUsers WHERE tUsrId=@tUsrId", sqlConn3); emailAdres.Parameters.AddWithValue("@tUsrId", lblUsrId); GridViewOrder.DataBind(); string email = Convert.ToString(emailAdres.ExecuteScalar()); я получаю ошибку в последней строке.

2. Изменил предложение where на: Label lblUsrId = (Label)GridViewOrder.FindControl("LabelId"); SqlCommand emailAdres = new SqlCommand("SELECT tblUsers.tUsrEmail FROM tblUsers WHERE tUsrId=@tUsrId", sqlConn3); emailAdres.Parameters.AddWithValue("@tUsrId", lblUsrId.Text); emailAdres.ExecuteScalar(); Новая ошибка гласит: ссылка на объект не установлена на экземпляр объекта. Я вроде как застрял здесь.