【问题标题】:Sending bulk emails with attachment paths in database在数据库中发送带有附件路径的批量电子邮件
【发布时间】:2012-03-21 00:14:56
【问题描述】:

我只是需要帮助。基本上,我正在创建一个向我们的客户发送批量电子邮件的 Windows 应用程序。 “电子邮件”和“附件”字段来自数据库。附件字段仅包含文件所在的路径,代码正在运行,但我没有收到 5 封电子邮件,而是收到了 15 封电子邮件。

注意:我的数据库只包含 5 条记录,因此我应该只收到 5 封带附件的电子邮件:

你能帮我吗,谢谢!

这是我的代码:

        string email;
        string attachment;
        ArrayList emailList = new ArrayList();
        ArrayList attachList = new ArrayList();
        private static readonly Logger log = new _EventLogger();

        private void btnSend_Click(object sender, EventArgs e)
        {
            conn.Open();
            SqlCommand cmdgetEmail = new SqlCommand("Select EMAIL, PATH from MEMBERREQUIREMENTS WHERE STATUS=0", conn);
            SqlDataReader getEmail = cmdgetEmail.ExecuteReader();
            //count = 0;
            while (getEmail.Read())
            {
                //count++;
                //email = getEmail.GetValue(i).ToString();
                //emailList.Add(email);
                //i = i + 1 - 1;
                email = getEmail.GetString(0);
                emailList.Add(email);
                attachment = getEmail.GetString(1);
                attachList.Add(attachment);
            }
            getEmail.Close();
            conn.Close();
            sendMail();
        }
            private void sendMail()
            {

                string from="myemail@email.com";
                foreach (string sendTo in emailList)
                {

                    foreach (string sendAttachments in attachList)
                    {
                    MailMessage mail = new MailMessage();
                    mail.To.Add(sendTo);
                    mail.From = new MailAddress(from, "Company Name'", Encoding.UTF8);
                    mail.Subject = subject;
                    mail.Body = msgBodyHead + msgBodyHead2 + msgDate + msgGreet + msgBody + msgAdobe + msgAssistance + msgCompliment + msgfooter;
                    mail.IsBodyHtml = true;
                    mail.Priority = MailPriority.High;    
                    mail.Attachments.Add(new Attachment(sendAttachments));

                        SmtpClient client = new SmtpClient();
                        client.Credentials = new System.Net.NetworkCredential(from, "password");
                        client.Host = "192.167.89.0";
                        client.EnableSsl = false;
                        try
                        {

                            progress();
                            client.Send(mail);

                        }

                        catch (Exception ex)
                        {
                            ProgressBar1.Visible = false;
                            timer1.Enabled = false;
                            Exception excpt = ex;
                            string errorMessage = string.Empty;

                            while (excpt != null)
                            {

                                errorMessage += excpt.ToString(); excpt = excpt.InnerException;
                                log.Error("Email - LMS Application Error", ex);
                                lblError.Text = "There was an error occured while processing your request.\n Please see Event Viewer for more details.";
                                lblError.ForeColor = System.Drawing.Color.Red;
                            }
                        }

                    }
                }
            }

【问题讨论】:

  • 请注意,[code][/code] 伪标签没有任何意义。格式化代码的最佳方法是在每一行前添加四个空格。如果您选择所有代码,然后在编辑器中点击{} 按钮,它就会正常工作。
  • 抱歉,wysywig 编辑器在我们的防火墙上被阻止,所以我看不到它。
  • 您只需要修复两个方法名称之前的空格。我自己尝试过,但是 (a) 没有编辑权限,并且 (b) 仅空白的编辑无论如何都被拒绝了:(
  • @Ergwun:很不幸。您的更改评论是否包含足够描述性的句子? (如果您保留“谢谢”和“我只需要帮助”位,它也可能不会被接受——但那是我假设其他人的行为背后的原因。)

标签: c# winforms


【解决方案1】:

您似乎从 MEMBERREQUIREMENTS 表中提取了一堆记录,其中包含一个电子邮件地址和一个附件路径,并构建了一个电子邮件地址和附件路径列表。

然后,您将遍历这些发送,为每个地址和附件组合发送一封电子邮件。我猜这不是你想要做的。 我想要么:

  • 每个收件人应该只收到他们记录中列出的附件。在这种情况下,您不想遍历每个地址的附件,或者可能
  • 每个收件人都应该收到每个附件,但附件应该列在单独的表格中,而不是存储在MEMBERREQUIREMENTS 表格中每个地址的记录中。

更新:

以下是执行前者的一些代码。请注意,这只是对您发布的代码的最小编辑,不会修复变量名称等或提供任何额外的错误检查(您可能想要这样做):

private static readonly Logger log = new _EventLogger();


private void btnSend_Click(object sender, EventArgs e)
{
    conn.Open();
    SqlCommand cmdgetEmail = new SqlCommand("Select EMAIL, PATH from MEMBERREQUIREMENTS WHERE STATUS=0", conn);
    SqlDataReader getEmail = cmdgetEmail.ExecuteReader();
    while (getEmail.Read())
    {
        email = getEmail.GetString(0);
        attachment = getEmail.GetString(1);
        this.sendMail(email, attachment)
    }
    getEmail.Close();
    conn.Close();
}

private void sendMail(string sendTo, string sendAttachments)
{
    MailMessage mail = new MailMessage();
    mail.To.Add(sendTo);
    mail.From = new MailAddress(from, "Company Name'", Encoding.UTF8);
    mail.Subject = subject;
    mail.Body = msgBodyHead + msgBodyHead2 + msgDate + msgGreet + msgBody + msgAdobe + msgAssistance + msgCompliment + msgfooter;
    mail.IsBodyHtml = true;
    mail.Priority = MailPriority.High;
    mail.Attachments.Add(new Attachment(sendAttachments));

    SmtpClient client = new SmtpClient();
    client.Credentials = new System.Net.NetworkCredential(from, "password");
    client.Host = "192.167.89.0";
    client.EnableSsl = false;
    try
    {

        progress();
        client.Send(mail);

    }

    catch (Exception ex)
    {
        ProgressBar1.Visible = false;
        timer1.Enabled = false;
        Exception excpt = ex;
        string errorMessage = string.Empty;

        while (excpt != null)
        {

            errorMessage += excpt.ToString(); excpt = excpt.InnerException;
            log.Error("Email - LMS Application Error", ex);
            lblError.Text = "There was an error occured while processing your request.\n Please see Event Viewer for more details.";
            lblError.ForeColor = System.Drawing.Color.Red;
        }
    }
}

【讨论】:

  • 你明白了,这就是我真正想要的:每个收件人应该只收到他们记录中列出的附件。
  • 如果没有 foreach 循环,它可以工作吗? sendTo 和附件是数组。
  • 无论如何我都会试一试.. 会在一分钟内回复
  • 它不起作用,它只发送一封带有正确附件的电子邮件,但它只读取表格中的最后一行。
  • sendTosendAttachments 是您用来遍历电子邮件地址和附件路径的字符串。我为您现在传递给sendMail 的电子邮件地址和附件路径保留了相同的名称,以便进行最少的编辑。正如我在回答中建议的那样,您应该适当地重命名这些变量。
【解决方案2】:

您有两个循环,一个用于发件人列表 (5),另一个用于附件列表(可能 3 个),总共执行了 15 次代码以发送电子邮件。我会将您的 sendmail 方法重组为:

foreach (string sendTo in emailList)
{
    // construct email fields ...
    // ...

    foreach (string sendAttachments in attachList)
    {
        mail.Attachments.Add(new Attachment(sendAttachments));
    }

    // send email ...
    // ...
}

【讨论】:

  • 根据您的 cmets 对他人的回答,您的查询中似乎可能收到多个附件。您需要调试您的代码并准确查看您从数据库中返回的内容。
【解决方案3】:
        private void sendMail()
        {

            string from="myemail@email.com";
            foreach (string sendTo in emailList)
            {

                foreach (string sendAttachments in attachList)
                {

您正在迭代 attachList,但我在此循环中看不到任何将 attachList 限制为仅用于收件人 sendTo 的附件。

【讨论】:

    【解决方案4】:

    这是因为您在附件 foreach 循环中调用了client.Send(mail);。它应该在那个循环之外。

    尝试将sendMail 方法更改为:

    private void sendMail()
    {
        string from = "myemail@email.com";
        foreach (string sendTo in emailList)
        {
            MailMessage mail = new MailMessage();
            mail.To.Add(sendTo);
            mail.From = new MailAddress(from, "Company Name'", Encoding.UTF8);
            mail.Subject = subject;
            mail.Body = msgBodyHead + msgBodyHead2 + msgDate + msgGreet + msgBody + msgAdobe + msgAssistance + msgCompliment + msgfooter;
            mail.IsBodyHtml = true;
            mail.Priority = MailPriority.High;
            foreach (string sendAttachments in attachList)
            {
                mail.Attachments.Add(new Attachment(sendAttachments));
            }
    
            SmtpClient client = new SmtpClient();
            client.Credentials = new System.Net.NetworkCredential(from, "password");
            client.Host = "192.167.89.0";
            client.EnableSsl = false;
            try
            {
    
                progress();
                client.Send(mail);
    
            }
    
            catch (Exception ex)
            {
                ProgressBar1.Visible = false;
                timer1.Enabled = false;
                Exception excpt = ex;
                string errorMessage = string.Empty;
    
                while (excpt != null)
                {
    
                    errorMessage += excpt.ToString(); excpt = excpt.InnerException;
                    log.Error("Email - LMS Application Error", ex);
                    lblError.Text = "There was an error occured while processing your request.\n Please see Event Viewer for more details.";
                    lblError.ForeColor = System.Drawing.Color.Red;
                }
            }
        }
    }
    

    【讨论】:

    • 现在我收到了 5 封电子邮件,但问题是附件都附在电子邮件中。我的问题是每个收件人应该只收到他们记录中列出的附件。例如sample@email.com的附件是1.pdf,他应该只收到1.pdf,其他文件不附件。
    • @Dhenn 在上面使用 Ergwun 的答案。看起来不错,他打败了我
    • 他删除了 foreach 循环,它可以工作,但它只发送 1 封带附件的电子邮件..
    【解决方案5】:

    不知道为什么在 SendMail 方法中需要数组列表和循环,可能是这样的:

      /// ...snip
      email = getEmail.GetString(0);
      attachment = getEmail.GetString(1);
      SendOneMail(email, attachment);
      /// ... snip
    
    
      private void SendOneMail(string email, string attach)
      {
        /// send yust one mail
      }
    

    【讨论】:

      猜你喜欢
      • 2019-05-11
      • 1970-01-01
      • 2012-08-11
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多