2011-06-01 72 views
1

我正在編寫一個應用程序,它會在整個應用程序的生命週期中發送大量電子郵件。SendEmail方法不起作用

用戶抱怨說應用程序確實沒有響應,速度一般很慢。我唯一可以提出的理由是,大量的電子郵件發送。所以我想我可以通過在不同的線程中發送電子郵件來解決問題!

我在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

我懷疑你最好使用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

+0

我會在早上嘗試第一件事。非常感謝! – 2011-06-01 04:24:04

1

您應該考慮採用更分散的模式發送這些電子郵件。具體來說,我會定義一些結構來存儲「發送請求」。這可以是SharePoint列表,MSMQ,Azure存儲中的隊列等。

您的發送電子郵件方法會將此請求排入此存儲單元,並且您將有單獨的進程或進程輪詢該隊列以檢查新定期請求。當找到新項目時,它們將被執行並出列。

如果您選擇使用多個代理來處理這些請求,則可能需要定義更復雜的機制來編排這些代理以防止干擾。

至於代理的主機,它可以是一個註冊爲計劃任務的應用程序,帶有「計時器」的Windows服務或調用我的計時器的SharePoint工作流程。

這只是一個實現,但最終您希望將「請求」電子郵件發送操作與「執行」電子郵件發送操作分開。

1

速戰速決,直到你可以設置一個更永久的解決辦法是把你的通過電子郵件發送到同一臺機器上的一臺smtp服務器,並讓它爲您轉發。

在這條路上,我會創建一個電子郵件服務,這很容易稱爲像wcf服務,您可以將線程合併到。

0

您是否收到任何錯誤訊息?我遇到過這種情況,最後在發送每封電子郵件之前放了一小段延遲(例如Thread.Sleep(500))。出於某種原因,smtp服務器拒絕了一些發送的電子郵件。另外,您應該遵循@ rushonerok的建議並通過SMTP服務器發送電子郵件。 GlennFerrieLive是一個更加強大的解決方案,應該也可以查看。

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

也許這將是有趣的人。