2011-09-07 53 views
0

我有一個小的控制檯應用程序。它會檢查幾個設置,做出一些決定併發送一封電子郵件。問題是電子郵件實際上並沒有發送,直到我的應用程序完成。我想在發送電子郵件的方法完成後馬上發送電子郵件。從我的應用程序發送電子郵件時,如何避免延遲?

最初,我創建了一個MailMessage並調用了.Send()。那是當我注意到郵件沒有被髮送,直到應用程序完成。

然後我嘗試使用任務並行庫。

var taskA = Task.Factory.StartNew(() => msg.Send()); 

此外,直到我的整個應用程序完成後纔會發送消息。

如何在msg.send執行時發送電子郵件,而不是在應用程序完成時發送郵件?

謝謝!

+1

如何一定是你,這是沒有得到發送,直到應用程序關閉? Send()是一種同步方法。這可能是Smtp服務器延遲。 –

+0

@Kevin - 我在完成發送的方法之後等待。 SMTPClient.Send()已經執行,我進入另一種方法。我等了15分鐘以上,我的收件箱中沒有任何內容出現。只要我點擊F5,消息就會顯示在應用完成的一兩秒內。如果我不等(只讓應用程序運行w/o斷點),則消息會在一兩秒鐘內出現。 – DenaliHardtail

+0

您的SMTP服務器是本地機器還是其他機器上? –

回答

0

避免延遲的最可靠的防火方法可能是使用拾取目錄,它將排隊消息而不是立即發送消息。

0

創建一個新的MailMessage並使用SmtpClient發送它。它會立即發送。我會添加一個例子。

編輯:使用smtp ser ver名稱和端口號填充變量host,port。

using (var mailer = new SmtpClient(host, port)) 
{ 
    using (var message = new MailMessage(sender, recipient, subject, body) { IsBodyHtml = false }) 
    { 
     mailer.UseDefaultCredentials = false; 
     mailer.Credentials = new NetworkCredential(user, pass); 
     mailer.EnableSsl = useSSL; 
     mailer.Timeout = Timeout; 
     mailer.Send(message); 

    } 
} 

如果您仍然遇到延遲,那麼延遲將在郵件服務器。

1

你應該使用SMTP客戶端。這樣做:

  MailMessage mm = new MailMessage(); 
      //fill in your message 
      NetworkCredential nc = new NetworkCredential(FromAddress, FromPassword); 
      SmtpClient sc = new SmtpClient(SmtpHost, SmtpPort); 
      sc.EnableSsl = true; 
      sc.Credentials = nc; 
      sc.Send(mm); 

在這個階段您的郵件將被髮送。

但是,發送電子郵件是異步行爲,所以在您收回郵件之前需要一些時間。

3

SmptClient支持通過SendAsync異步發送郵件,但實際上在Web應用程序中掛起請求線程。

爲避免阻塞,我建議使用ThreadPool在後臺線程中關閉電子郵件。這不會阻止你的應用程序。

ThreadPool.QueueUserWorkItem(o => { 
    using (SmtpClient client = new SmtpClient(...)) 
    { 
     using (MailMessage mailMessage = new MailMessage(...)) 
     { 
      client.Send(mailMessage, Tuple.Create(client, mailMessage)); 
     } 
    } 
}); 
0

簡單地將MailMessage和SmtpClient對象置於.Send()函數之後。

SmtpClient smtpClient = new SmtpClient("server", 25); 
smtpClient.UseDefaultCredentials = true; 

MailMessage message = new MailMessage("ToAddress","FromAddress"); 
message.Subject = "Test email"; 
message.Body = "Test email"; 

smtpClient.Send(message); 

message.Dispose(); 
smtpClient.Dispose(); 
相關問題