并非所有在 ASP.NET MVC 中使用 SmtpClient 发送的电子邮件都会被送达。为什么?如何解决?
-
21-09-2019 - |
题
这是设置:
- 我有一个通知控制器,每天从任务计划程序调用 1 次
- 该操作方法提取多达 300 个地址,循环访问它们,并使用 SmtpClient 类向每个收件人发送一封单独的电子邮件。
据我所知,该过程运行良好,没有例外...... 除了 并非所有电子邮件都已送达。有人对发生的事情以及如何解决有任何想法吗?
这是代码:
foreach (var emp in division.Users)
{
var fromAddress = "myfromaddress";
var mailServer = "mymailserver";
var toEmail = emp.EmailAddress;
var message = new MailMessage(fromAddress, toEmail)
{
Subject = subject,
Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>",
IsBodyHtml = true
};
var client = new SmtpClient(mailServer);
client.Send(message);
}
更新:
在发送电子邮件之间添加暂停可以解决该问题。但为什么这会起作用呢?有没有更好的方法(例如使用 Async()) 同样会以更好的方式解决问题???
更新了代码...
foreach (var emp in division.Users)
{
var fromAddress = "myfromaddress";
var mailServer = "mymailserver";
var toEmail = emp.EmailAddress;
var message = new MailMessage(fromAddress, toEmail)
{
Subject = subject,
Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>",
IsBodyHtml = true
};
var client = new SmtpClient(mailServer);
client.Send(message);
Thread.Sleep(3000); // Wait 3s until sending next message
}
解决方案
smtp 客户端有一个默认超时,默认值为 100 秒
其他提示
如果您没有任何例外,我会检查垃圾邮件文件夹和电子邮件地址。我还尝试从您的 Outlook 手动向未收到消息的地址之一发送电子邮件。
附带说明,除非您使用不同的邮件服务器,否则我认为您可以将此代码更改为
var client = new SmtpClient(mailServer);
var mailServer = "mymailserver";
foreach (var emp in division.Users)
{
var fromAddress = "myfromaddress";
var toEmail = emp.EmailAddress;
var message = new MailMessage(fromAddress, toEmail)
{
Subject = subject,
Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>",
IsBodyHtml = true
};
client.Send(message);
}
您还可以尝试 SmtpClient 类的 SendAsync 方法,如下所示:
// setup the callback method when the send finishes
client.SendCompleted += SendComplete; //new SendCompletedEventHandler(smtpSender_SendCompleted);
// send the email
client.SendAsync(message, null);
private void SendComplete(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
// do stuff on complete
}
我强烈建议使用 SmtpClient.SendAsync()
因为 Send() 正在阻塞。
我会检查您发送到的 SMTP 服务器的日志。笔记:与使用受信任的提供商发送电子邮件相比,发送自己的电子邮件更有可能成为垃圾邮件。
编辑: 添加了示例 SendAsync 代码
smtpClient.SendCompleted += smtpClient_SendCompleted;
static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
Log.ErrorFormat("Async Mail exception {0} :: {1}",
e.Error.GetType().Name, e.Error.Message);
}
}
不隶属于 StackOverflow