为什么我不能用c#连续发送两封邮件?

本文关键字:不能 连续 为什么 | 更新日期: 2023-09-27 18:14:20

我使用c#使用SmtpClient发送电子邮件。我每天要发送大约100封不同的邮件,而且我不能使用同一封邮件(添加多个收件人),因为邮件会根据收件人的不同而变化。

我没有使用本地SMTP服务器,我理解(根据@rizzle响应在这里)一封邮件和另一封邮件之间要间隔一段时间。然而,我让我的程序休眠了10秒钟,仍然只发送了第一封邮件,而不是第二封(到目前为止,我正在尝试用两封邮件而不是一百封)。这是我的代码,有什么想法吗?

foreach (Person p in clientList)
            {
                AlternateView plainView = AlternateView.CreateAlternateViewFromString("Texto visible para clientes que no tienen HTML", null, "text/plain");
                //AlternateView htmlView = AlternateView.CreateAlternateViewFromString("Here is an embedded image.<img src=cid:companylogo>", null, "text/html");
                string htmlString = "html string body of the email";
                AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlString, null, "text/html");
                System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
                message.AlternateViews.Add(htmlView);
                message.To.Add(p.email.Trim());
                message.Subject = p.nombre+", email subject";
                message.From = new System.Net.Mail.MailAddress(fromAddress);
                System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("...");
                NetworkCredential myCreds = new NetworkCredential(usr, pass, "");
                client.Credentials = myCreds;
                client.Send(message);
                System.Threading.Thread.Sleep(10000);
            }

为什么我不能用c#连续发送两封邮件?

发送最后一条消息后立即执行client.Dispose(),如果您使用的是dotnet 4。这将强制dotnet SMTP完成它的工作。

查看这里:System.Net.Mail和MailMessage不立即发送消息

如果您使用的是早期版本的DotNet,请尝试做一些事情。

完成消息实例后执行message.Dispose()

在本地定义SmtpClient(在方法中)并在完成发送时退出该方法。也就是说,不要试图将您的客户端实例作为一个字段保存在一个长期存在的类实例中;它不会刷新您发送到服务器的最后一条消息,直到它完成。

(他们确实在dotnet 4.0中修复了这个问题)

在3.5中尝试使用:

SmtpClient client = ...
client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
using (MailMessage message = ...)
{
  // where userToken is a user-defined token
  // to be passed to the SendCompletedCallback
  client.SendAsync(message, userToken);
} // Disposes of message

然后在SendCompletedCallback触发下一个…

SmtpClient类