2013-10-24 46 views
1

我需要發送不同的電子郵件給不同的人。爲每個收件人生成不同的電子郵件正文,然後我調用以下方法。也就是說,如果有10個收件人,下面的方法被稱爲10倍:如何加快發送電子郵件?

 public int Send_Mail(string send_from_bc, string send_to_bc, string subject_bc, string body_bc) 
     { 
      try 
      { 
       int count_returned = 0; 
       var send_from = new MailAddress(send_from_bc, "The Admin"); 
       var send_to = new MailAddress(send_to_bc); 
       string subject = subject_bc; 
       string body = body_bc; 

       var smtp = new SmtpClient 
       { 
        Host = "**my smtp host**", 
        Port = 25, 
        DeliveryMethod = SmtpDeliveryMethod.Network, 
        Timeout = 300000 
       }; 

       using (var message = new MailMessage(send_from, send_to) 
       { 
        Subject = subject, 
        Body = body 
       }) 
       { 
        message.IsBodyHtml = true; 
        smtp.Send(message); 
        count_returned += 1; 
       } 

       return count_returned; 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Exception caught in Send_Mail", ex); 
      } 
     } 

的問題是,該走的時候了難以置信的,甚至派幾個郵件(如10級或15的郵件)。大約需要2-5分鐘才能發送一封郵件。現在,我確信部分提供給我的SMTP主機有問題。但是我能做些什麼來加快速度?

此外,有沒有一些方法來實現這一目標:眼下,用戶點擊一個按鈕,然後說,發送兩封郵件,他/她必須等待2-5分鐘(有時甚至更多)之前控制返回並且標籤的值更改爲「發送的電子郵件」。可以做些什麼,以便用戶只需點擊按鈕,發送電子郵件,他/她可以關閉窗口並繼續他的工作?

我現在處於關鍵階段,任何幫助將不勝感激。

+0

那麼.. SMTP服務器是不是在我的控制。不過,我會盡力找出最新的錯誤。還有什麼可以優化我的代碼發送多個電子郵件? –

+0

如果您要發送多封郵件,最好讓所有電子郵件都保持「連接」狀態。話雖如此,我沒有看到你的連接初始化的位置。 – Bob2Chiv

+0

嗯..謝謝。該connection.Close()部分不是必需的。我在我的代碼中刪除它。順便說一下,通過不爲每封郵件創建新的SmtpClient對象,我減少了將郵件從大約2-5分鐘發送到30-40秒的時間。現在,我創建一次併爲每個郵件使用同一個對象。 無論我發送1封郵件還是10封郵件,現在需要30-40秒。所以我猜這一切都歸結到SMTP服務器現在.. –

回答

2

首先 - 不要讓用戶等待這個動作。如果您必須等待2-5分鐘,那麼會話可能會很時間。相反,使此操作成爲在後臺運行的異步任務。

然後我會考慮彈出一個通知,說明電子郵件以後發送給用戶,而不是強迫他們等待。

一種10起動機 - 將您發送電子郵件的代碼放到一個單獨的類:

public class EmailSender 
{ 
    public EmailSender(/* Parameters required, e.g. list of emails */) 
    { } 

    public void SendEmails() 
    { 
     // Long running task 
    }  
} 

然後在你的頁面,說一個按鈕被點擊:

protected void btn_SendEmails_Clicked(object sender, EventArgs e) 
{ 
    EmailSender emailSender = new EmailSender(/* Any setup code required */); 
    ThreadPool.QueueUserWorkItem(emails => emailSender.SendEmails()); 
} 

要處理的通知回用戶在電子郵件完成時想要提出事件,並可能使用SignalR等提示瀏覽器。

請注意,我沒有試過編譯這段代碼,但應該給你一般的想法。

+0

你能告訴我如何開始嗎?這是我創建的Web應用程序... –

+0

@SinghSiddharth:更新了一些示例代碼 – Ian