我有一个小型控制台应用程序。它会检查一些设置,做出一些决定并发送电子邮件。问题是在我的申请完成之前,电子邮件实际上并未发送。我想在发送电子邮件的方法完成后立即发送电子邮件。
最初,我刚刚创建了一个MailMessage并调用了.Send()。就在那时我注意到在应用程序完成之前没有发送邮件。
然后我尝试使用任务并行库。
var taskA = Task.Factory.StartNew(() => msg.Send());
同样,在整个应用程序完成之前,消息才会被发送。
如何在msg.send执行时发送电子邮件,而不是在应用完成时发送电子邮件?
谢谢!
答案 0 :(得分:3)
SmptClient
支持通过SendAsync
异步发送邮件,但实际上在Web应用程序中会挂起请求线程。
为避免阻止,我建议使用ThreadPool
在后台线程中触发电子邮件。这不会阻止您的申请。
ThreadPool.QueueUserWorkItem(o => {
using (SmtpClient client = new SmtpClient(...))
{
using (MailMessage mailMessage = new MailMessage(...))
{
client.Send(mailMessage, Tuple.Create(client, mailMessage));
}
}
});
答案 1 :(得分:1)
您应该使用SMTP客户端。这样做:
MailMessage mm = new MailMessage();
//fill in your message
NetworkCredential nc = new NetworkCredential(FromAddress, FromPassword);
SmtpClient sc = new SmtpClient(SmtpHost, SmtpPort);
sc.EnableSsl = true;
sc.Credentials = nc;
sc.Send(mm);
在此阶段,您的邮件将被发送。
但是,发送电子邮件是一种异步行为,因此在您收到邮件之前需要一些时间。
答案 2 :(得分:0)
避免延迟的最可靠的方法可能是使用一个拾取目录,该目录将对消息进行排队而不是立即发送。
答案 3 :(得分:0)
创建一个新的MailMessage并使用SmtpClient发送它。它会立即发送。我将添加一个例子。
编辑:使用smtp服务器名称和端口号填充变量host,port。
using (var mailer = new SmtpClient(host, port))
{
using (var message = new MailMessage(sender, recipient, subject, body) { IsBodyHtml = false })
{
mailer.UseDefaultCredentials = false;
mailer.Credentials = new NetworkCredential(user, pass);
mailer.EnableSsl = useSSL;
mailer.Timeout = Timeout;
mailer.Send(message);
}
}
如果您仍然遇到延迟,则延迟将在邮件服务器上。
答案 4 :(得分:0)
只需在.Send()函数之后处理MailMessage和SmtpClient对象。
SmtpClient smtpClient = new SmtpClient("server", 25);
smtpClient.UseDefaultCredentials = true;
MailMessage message = new MailMessage("ToAddress","FromAddress");
message.Subject = "Test email";
message.Body = "Test email";
smtpClient.Send(message);
message.Dispose();
smtpClient.Dispose();
答案 5 :(得分:0)
使用SmtpClient设置:
smtpClient.ServicePoint.MaxIdleTime = 2;
https://weblogs.asp.net/stanleygu/tip-14-solve-smtpclient-issues-of-delayed-email-and-high-cpu-usage