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

时间:2011-11-10 12:36:55

标签: c# smtp sendmail smtpclient

我使用smtpClient使用c#发送电子邮件。我必须每天发送大约100封不同的电子邮件,因为电子邮件根据收件人的不同而不能使用相同的邮件(添加多个收件人)。

我没有使用本地SMTP服务器,我理解(根据@rizzle响应here) 有一段时间必须留在一封邮件和另一封邮件之间。但是,我正在睡觉我的程序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);

            }

2 个答案:

答案 0 :(得分:4)

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

见这里:System.Net.Mail and MailMessage not Sending Messages Immediately

如果您使用的是早期版本的DotNet,请尝试做几件事。

完成邮件实例后,请message.Dispose()

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

(他们确实在dotnet 4.0中解决了这个问题)

答案 1 :(得分:2)

在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 Class