【问题标题】:How to send email to multiple recipients separately in one button click如何一键分别向多个收件人发送电子邮件
【发布时间】:2018-08-23 10:27:53
【问题描述】:

我有一个邮件程序,我想在其中向多个收件人发送邮件。收件人可以来自数据库或 Excel 工作表。这是代码:

  protected void btnSubmit_Click(object sender, EventArgs e)
    {

        GetAllRecipient();


        Msg = null;
        ClientScript.RegisterStartupScript(GetType(), "alert", "alert('Email sent.');", true);

    }
  public void SendHTMLMail()
    {


       StreamReader reader = new StreamReader(Server.MapPath("~/one.html"));
        string readFile = reader.ReadToEnd();
        Regex regx = new Regex("(?<!src=\")http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*([a-zA-Z0-9\\?\\#\\=\\/]){1})?", RegexOptions.IgnoreCase);
        string output = regx.ToString();
        output = readFile;

        Msg.Body = output.ToString();
        Msg.IsBodyHtml = true;
        int i = 0;
        string username = Server.UrlEncode(this.txtUsername.Text);
        output = regx.Replace(output, new MatchEvaluator((match) =>
        {

            var url = Uri.EscapeDataString(match.Value.ToString());
            url = url.Replace("%3F", "&").Replace("%3D", "=");
            return $"http://localhost4654/two?sender={username}&link={url}&mailer_id={i}";
        }));

        Msg.From = new MailAddress(txtUsername.Text);
        Msg.Subject = null;

        smtp.Host = "smtp.gmail.com";
        smtp.Port = 587;
        smtp.UseDefaultCredentials = false;
        smtp.Credentials = new System.Net.NetworkCredential(txtUsername.Text, txtpwd.Text);
        smtp.EnableSsl = true;
    }
    public void GetAllRecipient()
    {
        if (RadioButton1.Checked)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "SELECT address FROM address1";
            cmd.Connection = sql;
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            sql.Open();
            da.Fill(dt);
            sql.Close();

                for (int a = 0; a < dt.Rows.Count; a++)
                {
                foreach (DataRow row in dt.Rows)
                {
                    Msg.To.Add(row["address"].ToString());
                   SendHTMLMail();

                }
            }
        }

        else if (RadioButton2.Checked)
        {
            string connectionString = "";
            if (FileUpload1.HasFile)
            {
                string fileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
                string fileExtension = Path.GetExtension(FileUpload1.PostedFile.FileName);
                string fileLocation = Server.MapPath("~/App_Data/" + fileName);
                FileUpload1.SaveAs(fileLocation);

                if (fileExtension == ".xls")
                {

                    connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
                }
                else if (fileExtension == ".xlsx")
                {
                    connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
                }
                OleDbConnection con = new OleDbConnection(connectionString);
                OleDbCommand cmd = new OleDbCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.Connection = con;
                OleDbDataAdapter dAdapter = new OleDbDataAdapter(cmd);
                DataTable dt = new DataTable();
                con.Open();
                DataTable dtExcelSheetName = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string getExcelSheetName = dtExcelSheetName.Rows[0]["Table_Name"].ToString();
                cmd.CommandText = "SELECT address FROM [" + getExcelSheetName + "]";
                dAdapter.SelectCommand = cmd;
                dAdapter.Fill(dt);
                con.Close();

                for (int a = 0; a < dt.Rows.Count; a++)
                {
                    foreach (DataRow row in dt.Rows)
                    {
                        Msg.To.Add(row["address"].ToString());                       
                        SendHTMLMail();
                        smtp.Send(Msg);

                    }
                }
            }
        }
        else if (RadioButton3.Checked)
        {
            if (FileUpload2.HasFile)
            {

                string fileName = Path.GetFileName(FileUpload2.PostedFile.FileName);

                string fileLocation = Server.MapPath("~/App_Data/" + fileName);
                FileUpload2.SaveAs(fileLocation);
                StreamReader sr = new StreamReader(fileLocation);

                String line = sr.ReadToEnd();
                string[] toAddressArray;
                toAddressArray = line.Split(new char[] { ' ' });
                foreach (string a in toAddressArray)
                {
                    Msg.To.Add(a);

                }
            }
        }

    }

我面临的问题是 - 当我发送邮件时,它会在同一封邮件中发送给所有收件人,而不是单独发送。我怎样才能分开发送邮件,以便没有两个收件人互相认识。 此外,在我作为邮件正文发送的 HTML 页面中,有一些链接。当收件人单击任何链接时,我将在文本框“rep.text”中检索他的邮件 ID。因此,即使单击链接的人是第 4 位或第 5 位,我也会从收件人列表中获取姓氏。当我使用密件抄送时也会发生这种情况。

【问题讨论】:

  • 使用 Msg.Bcc.Add 不要使用 Msg.To.Add
  • 但在这里我还要做一件事。在我作为邮件正文发送的 html 页面中,有一些链接。当收件人单击任何链接时,我正在检索他的邮件 ID。所以,在使用密件抄送的同时,我会从密件抄送列表中获取姓氏,即使点击链接的人是第 4 位或第 5 位
  • 我已经编辑了代码@AdinugrahaTawaqal
  • 遍历所有用户并向每个用户发送一封电子邮件,以便他们获得唯一的链接。
  • 因为我是这个平台的新手,所以我对 .net 了解不多。你能提供代码吗? @Scrobi

标签: c# .net sql-server smtp oledbconnection


【解决方案1】:

使用 Msg.Bcc.Add(sample@sample.com); 代替 Msg.To.Add(sample@sample.com);

See here

【讨论】:

    【解决方案2】:
    public static void SendEMail(string to, string subject, string body)
    {
        SmtpClient smtpClient = new SmtpClient("smtp.mail.yahoo.com", 587);
    
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = false;
        smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
    
        smtpClient.Credentials = new NetworkCredential("my@com.pl", "12345!");
    
        MailMessage mailMessage = new MailMessage("\"" + Info.SiteName + "\" <" + Info.EMail + ">", "recipient1@gmail.com");
    
        mailMessage.Bcc.Add("recipient2@gmail.com");
        mailMessage.Bcc.Add("recipient3@gmail.com");
        mailMessage.Bcc.Add("recipient4@gmail.com");
        mailMessage.Bcc.Add("recipient5@gmail.com");
        mailMessage.Bcc.Add("recipient6@gmail.com");
    
        mailMessage.IsBodyHtml = true;
    
        mailMessage.Priority = MailPriority.High;
    
        mailMessage.Body = body;
        mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
        mailMessage.Subject = subject;
        mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;
    
        smtpClient.Send(mailMessage);
    }
    

    【讨论】:

      【解决方案3】:

      我认为我为你编写代码不会帮助你学习。此外,您遇到的问题似乎与编程语言无关,而是程序为实现其目标所需采取的逻辑步骤。

      在开始编写代码之前,最好先写下这些步骤。

      你最好把这个任务分解成小块的代码。

      根据我从您的代码中可以看出,用户在表单上填写了他们的详细信息,以便向收件人列表发送电子邮件。

      我已将步骤分解为不同的方法,希望对您有所帮助。在每个方法中填写它需要做的事情,仅此而已。确保每个步骤都有效,然后再进行下一步。我认为您拥有执行此操作的大部分代码,它只需要重组。

      protected void btnSubmit_Click(object sender, EventArgs e)
      {
          string user = GetUserDetails();
          List<string> recipients = GetAllRecipient();
          string html = GetHtmlTemplate();
          foreach (var recipient in recipients)
          {
              html = html.Replace("<<SOME TAG>>", recipient);
              SendEmail(recipient, html);
          }
      }
      
      public string GetUserDetails()
      {
          return txtUsername.Text;
      }
      
      public List<string> GetAllRecipient()
      {
          //TODO: Get all your recipient from database or excel
          //e,g, 
          return new List<string>() {"someemail@address.com", "anotheremail@address.com"};
      }
      
      public void SendEmail(string recipient, string html)
      {
          //TODO: Send the email
      }
      

      我可以确定的步骤是: 用户 - 点击按钮

      • 第一步:获取用户详细信息
      • 第二步:获取所有收件人
      • 第三步:获取Html模板
      • 第 4 步:对于每个收件人 => 更新 html 模板 唯一链接并发送电子邮件。

      【讨论】:

      • 我想知道两件事- 1. 我不能遍历收件人以便将电子邮件分别发送给他们吗? 2. 是否可以在一键点击事件中这样做? @Scrobi 忘记 html 部分。主要问题是我无法使用上面的 for 循环单独发送邮件。我不想要密件抄送选项
      • 我已经完成了所有工作,但邮件仍然会立即发送给所有人。请检查我的每一行的 for 循环。我想那里出了点问题
      • for (int a = 0; a
      • 第二个循环为所有行调用 SendHTMLMail() 函数
      • 对不起,我现在不明白这段代码的上下文,请您更新问题中的代码。
      猜你喜欢
      • 1970-01-01
      • 2019-03-01
      • 2012-05-18
      • 2019-04-22
      • 2017-12-05
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多