我使用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);
}
答案 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
触发下一个......