C# SendEmail方法不工作

C# SendEmail方法不工作,c#,sharepoint,sharepoint-2007,C#,Sharepoint,Sharepoint 2007,我正在编写一个应用程序,在整个应用程序的生命周期中发送大量电子邮件 用户抱怨应用程序响应速度太慢。我唯一能想到的原因就是发送了大量的电子邮件。所以我想我可以通过用不同的线程发送电子邮件来解决这个问题 我在SPUtility助手类中使用sendmail方法。现在,我有一个方法如下所示: public static void SendEmail(SPWeb web, string to, string subject, string body) { //Some logic goes he

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

用户抱怨应用程序响应速度太慢。我唯一能想到的原因就是发送了大量的电子邮件。所以我想我可以通过用不同的线程发送电子邮件来解决这个问题

我在SPUtility助手类中使用sendmail方法。现在,我有一个方法如下所示:

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);
    });
}
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);
        }
    });
}
这个方法是在DLL中定义的,它是从许多不同的Web部件调用的

但这是行不通的。如果我删除QueueUserWorkItem位,让它在线程外发送电子邮件,它就像一个符咒一样工作,但同样,它很慢


<>我如何解决这个问题?

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

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

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

对于代理的主机,这可以是注册为计划任务的应用程序、带有“计时器”的Windows服务,也可以是调用计时器的SharePoint工作流


这只是一个实现,但最终你想将“请求”电子邮件发送的行为与电子邮件发送的“执行”行为解耦。

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

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

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

对于代理的主机,这可以是注册为计划任务的应用程序、带有“计时器”的Windows服务,也可以是调用计时器的SharePoint工作流


这只是一个实现,但最终您希望将“请求”电子邮件发送的操作与“执行”该电子邮件发送的操作分离。

我想您最好使用


此MSDN帖子与您的情况类似,

我怀疑您最好使用


此MSDN帖子与您的情况类似,

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


接下来,我将创建一个电子邮件服务,该服务很容易调用,就像wcf服务一样,您可以将线程合并到该服务中。

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


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

您是否收到任何错误消息?我曾经遇到过这种情况,结果在发送每封电子邮件之前都有一点延迟(例如Thread.Sleep(500))。出于某种原因,smtp服务器拒绝了发送的部分电子邮件。此外,您应该遵循@rushonerok的建议,改为通过SMTP服务器发送电子邮件。GlennFerrieLive是一个更强大的解决方案,也应该加以研究。

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

此外,还有一个选项可以执行以下操作:

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

也许有人会对它感兴趣。

还有一个选项可以这样做:

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

也许有人会对它感兴趣。

我早上第一件事就是试试这个。谢谢!我早上第一件事就是试试这个。谢谢!