【问题标题】:only the first email is being sent in a For Loop of a Window Service只有第一封电子邮件在窗口服务的 For 循环中发送
【发布时间】:2017-11-06 12:04:50
【问题描述】:

我想使用我自己的数据库向超过 2 个人发送电子邮件。 所以我使用 for 循环发送电子邮件。但它只是发送给第一个人。 我还检查了 email_data 有 2 个以上,我把 email 数据带好了。 这是我的代码。

    private void Email()
    {
        DataTable email_data = GetEmailData();
           .....
                String from = "aa@gmail.com";

                for (int i = 0; i <= email_data.Rows.Count; i++)
                {
                    String to = email_data.Rows[i][0].ToString();

                    using (MailMessage mm = new MailMessage(from, to))
                    {

                        SmtpClient smtp = new SmtpClient();
                        mm.Subject = "List";
                        mm.Attachments.Add(new Attachment(new MemoryStream(bytes), "List.xlsx"));
                        mm.IsBodyHtml = true;

                        smtp.Host = "smtp.gmail.com";
                        smtp.EnableSsl = true;
                        System.Net.NetworkCredential credentials = new System.Net.NetworkCredential();
                        credentials.UserName = "aa@gmail.com";
                        credentials.Password = "aa";
                        smtp.UseDefaultCredentials = true;
                        smtp.Credentials = credentials;
                        smtp.Port = 587;
   //works well in the first loop, but stops here in the second loop
                        smtp.Send(mm);
                    }
                }
        }

【问题讨论】:

  • 虽然这可能不是您的问题的原因,但请注意SmtpClientAttachment 实现了IDisposable,因此您应该将它们包含在using(...) 语句中
  • @Nuf 我想我使用 using(...) 语句,你的意思是 for 循环也应该用 using() 语句括起来?
  • 我的意思是using(SmtpClient smtp = new SmtpClient()) {...}using(Attachment(new MemoryStream(bytes), "List.xlsx")) {...}
  • @Nuf 我试过了,但还是不行。。对于第一封电子邮件,它发送得很完美,但是当我转到第二个 for loop 时,它在 smtp.Send(mm) 之前停止了.

标签: c# email windows-services sendmail taskscheduler


【解决方案1】:

我尝试在我的计算机上运行您的代码(我只是将凭据替换为我的私人 gmail 帐户凭据)并且它没有任何问题 - 电子邮件已成功发送到 3 个不同的电子邮件地址。所以问题可能与您的计算机有关。因此,您可以尝试以下一些想法:

  • 在不同的计算机上运行您的程序,看看它是否在那里工作(对于 相比之下,我在 Windows 10 Home、Visual Studio 2017 CE、面向 .NET Framework 4.7 的控制台应用程序上成功运行)
  • 检查您的防病毒软件和防火墙,如果它们没有以某种方式阻止大量电子邮件发送。
  • 尝试调试SmtpClient.Send()方法的源代码,看看在哪里 确切地执行停止,这应该给你一个提示什么是错的 以及如何解决它。
  • 在 app.config 中启用网络通信的详细记录,看看连接到 SMTP 服务器时是否有问题。

顺便说一句,可能存在错误:for (int i = 0; i &lt;= email_data.Rows.Count; i++) 应该是 for (int i = 0; i &lt; email_data.Rows.Count; i++)

【讨论】:

  • 这太奇怪了......它仍然不起作用我决定使用 BCC 代替那些。无论如何谢谢你..!
【解决方案2】:

通过添加调试打印检查行数

还可以尝试把睡眠放在最后

                    smtp.UseDefaultCredentials = true;
                    smtp.Credentials = credentials;
                    smtp.Port = 587;
                    smtp.Send(mm);

System.Threading.Sleep(1000);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多