SendEmail方法不起作用

时间:2011-06-01 03:58:47

标签: c# sharepoint sharepoint-2007

我正在编写一个应用程序,它会在整个应用程序的生命周期中发送大量电子邮件。

用户抱怨该应用程序确实没有响应且通常很慢。我唯一可以提出的原因是发送的电子邮件很重。所以我认为我可以通过在不同的线程中发送电子邮件来解决问题!

我在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位,只是让它在一个线程之外发送电子邮件,它就像一个魅力,但是又一次,它很慢。

我该如何解决这个问题?

5 个答案:

答案 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是一个更强大的解决方案,也应该看一下。