我正在编写一个应用程序,它会在整个应用程序的生命周期中发送大量电子邮件。
用户抱怨该应用程序确实没有响应且通常很慢。我唯一可以提出的原因是发送的电子邮件很重。所以我认为我可以通过在不同的线程中发送电子邮件来解决问题!
我在SPUtility助手类中使用SendEmail方法。现在,我有一个看起来像这样的方法:
public static void SendEmail(SPWeb web, string to, string subject, string body)
{
//Some logic goes here
System.Threading.ThreadPool.QueueUserWorkItem(o =>
{
SPUtility.SendEmail(web, false, false, to, subject, body, false);
});
}
此方法在DLL中定义,并且它是从很多不同的webpart调用的。
但这不起作用。如果我删除了QueueUserWorkItem位,只是让它在一个线程之外发送电子邮件,它就像一个魅力,但是又一次,它很慢。
我该如何解决这个问题?
答案 0 :(得分:5)
我怀疑你最好使用MailMessage Class (System.Net.Mail)
MailMessage mess =
new MailMessage(
SPContext.Current.Site.WebApplication.OutboundMailReplyToAddress,
sendTo,
subject,
message);
mess.IsBodyHtml = true;
SmtpClient smtp =
new SmtpClient(
SPContext.Current.Site.WebApplication.OutboundMailServiceInstance.Server.Address);
smtp.Send(mess);
此MSDN帖子与您的情况相似,Sending Email using SPUtility.SendEmail slow in production
答案 1 :(得分:5)
还可以选择这样做:
public static void SendEmail(SPWeb web, string to, string subject, string body)
{
var siteId = Web.Site.ID;
System.Threading.ThreadPool.QueueUserWorkItem(o =>
{
using (var site = new SPSite(siteId))
using (var myWeb = site.OpenWeb())
{
SPUtility.SendEmail(myWeb, false, false, to, subject, body);
}
});
}
也许某人会感兴趣。
答案 2 :(得分:1)
您应该考虑使用更分散的模式发送这些电子邮件。具体来说,我会定义一些结构来存储“发送请求”。这可以是SharePoint列表,MSMQ,Azure存储中的队列等。
您的发送电子邮件方法会将请求排入此存储单元,您将有一个单独的进程或进程轮询该队列以定期检查新请求。当找到新项目时,它们将被执行并出列。
如果您选择使用多个代理来处理这些请求,则可能需要定义一个更复杂的机制来编排这些代理以防止干扰。
对于代理的主机,这可以是注册为计划任务的应用程序,具有“计时器”的Windows服务,或调用我的计时器的SharePoint工作流程。
这只是一个实现,但最终您想要将“请求”电子邮件发送的操作与“执行”该电子邮件发送的行为分离。
答案 3 :(得分:1)
快速修复,直到您可以设置更永久的解决方案,将您的电子邮件发送到同一台计算机上的smtp服务器并让它为您转发。
在路上,我会创建一个电子邮件服务,这很容易像wcf服务一样调用,您可以将线程合并到其中。
答案 4 :(得分:0)
您收到任何错误消息吗?我遇到了这一次,最后在发送每封电子邮件之前放了一小段延迟(例如Thread.Sleep(500))。出于某种原因,smtp服务器拒绝了一些发送的电子邮件。此外,您应该遵循@ rushonerok的建议,并通过SMTP服务器发送电子邮件。 GlennFerrieLive是一个更强大的解决方案,也应该看一下。