2011-09-13 81 views
6

當我使用System.Net.Mail發送郵件時,似乎郵件不立即發送。他們需要一兩分鐘才能到達我的收件箱。一旦我退出應用程序,所有的消息都會在幾秒鐘內收到。是否有某種可以強制SmtpClient立即發送消息的郵件消息緩衝區設置?System.Net.Mail和MailMessage不立即發送郵件

public static void SendMessage(string smtpServer, string mailFrom, string mailFromDisplayName, string[] mailTo, string[] mailCc, string subject, string body) 
{ 
    try 
    { 
     string to = mailTo != null ? string.Join(",", mailTo) : null; 
     string cc = mailCc != null ? string.Join(",", mailCc) : null; 

     MailMessage mail = new MailMessage(); 
     SmtpClient client = new SmtpClient(smtpServer); 

     mail.From = new MailAddress(mailFrom, mailFromDisplayName); 
     mail.To.Add(to); 

     if (cc != null) 
     { 
      mail.CC.Add(cc); 
     } 

     mail.Subject = subject; 
     mail.Body = body.Replace(Environment.NewLine, "<BR>"); 
     mail.IsBodyHtml = true; 

     client.Send(mail); 
    } 
    catch (Exception ex) 
    { 
     logger.Error("Failure sending email.", ex); 
    } 

感謝,

馬克

+0

您使用[發送](http://msdn.microsoft.com/zh-cn/library/swas0fwc.aspx)或[SendAsync](http://msdn.microsoft.com/zh-cn/library /x5x13z6h.aspx)?您是直接發送到您的電子郵件服務器還是通過其他SMTP服務器? – Rup

+0

請注意,當我給自己發送一封電子郵件時,它幾乎是立即發送,所以它不是smtp服務器。 – mservidio

+0

使用發送。我剛剛添加了我的幫助程序方法... – mservidio

回答

10

試試這個,如果你在DOTNET 4.0

using (SmtpClient client = new SmtpClient(smtpServer)) 
{ 
    MailMessage mail = new MailMessage(); 
    // your code here. 

    client.Send(mail); 
} 

這將處置您的client實例,從而導致它包裹起來的SMTP會話與一個QUIT協議元素。

如果您遇到早期的dotnet版本,請嘗試安排爲您的程序發送的每封郵件重新使用相同的SmtpClient實例。

當然,請記住,電子郵件本質上是一個存儲轉發系統,並且從smtp SEND到接收的延遲沒有任何同步(甚至可以正式預測)。

+0

太棒了!這就是它。有可能是進一步的延期工作,不會立即執行,除非按照您提及的方式處理。 – mservidio

0

我同意Ollie。 要回答你的問題,不,我不相信你可以通過表單設置緩衝區設置。

什麼是你的問題令人困惑的是,你說這個信息需要一兩分鐘才能到達你的收件箱,但是接着說當發送給你自己時,他們立即通過......我相信你的意思是說在內部,消息發送正常並且問題僅出現在外部地址上。在這種情況下,聽起來好像您的電子郵件服務器可能會將這些消息排在其他電子郵件後面(這是正常活動)。在外部網站上等待一兩分鐘的電子郵件並不是一個漫長的等待。

但是,這是不太可能的,但您的交換服務器設置爲掃描傳出消息?

+0

當我說發送自己的時候,我的意思是說,當我自己在Outlook和電子郵件中打開一條新消息時,它會立即進入我自己的收件箱。當我使用上面的代碼發送自己的電子郵件(到同一地址)時,郵件需要一兩分鐘纔會顯示在我的收件箱中。 – mservidio

+0

這樣做更有意義。我不認爲這是一個掃描問題,也許在交換服務器上的中繼設置呢? – mutek

+0

請參閱上面的註釋。 @Jason更詳細地解釋了這個問題。 – mservidio

相關問題