SendEmail方法不起作用

本文关键字:不起作用 方法 SendEmail | 更新日期: 2023-09-27 17:58:11

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

用户抱怨该应用程序确实没有响应,而且速度普遍较慢。我唯一能想到的原因是发送了大量的电子邮件。所以我想我可以通过在不同的线程中发送电子邮件来解决这个问题!

我在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中定义的,它是从许多不同的Web部件调用的。

但这是行不通的。如果我删除QueueUserWorkItem位,让它在线程之外发送电子邮件,它就像一个魅力,但话说回来,它很慢。

我该如何解决这个问题?

SendEmail方法不起作用

我怀疑您最好使用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文章与您的情况类似,使用SPUtility.SendEmail在生产时速度较慢

还有一个类似的选项:

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);
        }
    });
}

也许这对某人来说会很有趣。

您应该考虑使用更分布式的模式来发送这些电子邮件。具体来说,我将定义一些存储"发送请求"的结构。这可以是SharePoint列表、MSMQ、Azure存储中的队列等。

您的发送电子邮件方法会将请求排入此存储单元,并且您会有一个或多个单独的进程轮询来定期检查新请求。当发现新项目时,它们将被执行并退出队列。

如果选择使用多个代理来处理这些请求,则可能需要定义一个更复杂的机制来协调这些代理以防止干扰。

至于代理的主机,它可以是注册为计划任务的应用程序、具有"计时器"的Windows服务,也可以是调用计时器的SharePoint工作流。

这只是一个实现,但最终您希望将"请求"电子邮件发送的行为与"执行"电子邮件发送行为脱钩。

在设置更永久的解决方案之前,一个快速的解决方案是将您的电子邮件发送到同一台机器上的smtp服务器,并让它为您转发。

接下来,我会创建一个电子邮件服务,它很容易像wcf服务一样调用,您可以将线程化纳入其中。

您收到任何错误消息了吗?我曾经遇到过这种情况,在发送每封电子邮件之前都会有一个小的延迟(例如Thread.Sleep(500))。由于某种原因,smtp服务器拒绝了发送的一些电子邮件。此外,您应该听从@rushonerok的建议,改为通过SMTP服务器发送电子邮件。GlennFerrieLive是一个更强大的解决方案,也应该考虑。