.NET 發送電子郵件的最佳方法(System.Net.Mail 有問題)
這似乎很簡單。我需要從一些 ASP.NET 應用程序發送電子郵件。我需要始終如一地做到這一點,而不會出現奇怪的錯誤,也不會出現 CPU 使用率過高的情況。我不是在談論群發電子郵件,只是偶爾發送電子郵件。
System.Net.Mail似乎被嚴重破壞了。SmtpClient 不發出 Quit 命令(可能是因為 Microsoft(R) 對以下規範不感興趣),因此連接保持打開狀態。因此,如果有人在該連接最終關閉之前嘗試發送電子郵件,您可能會從 SMTP 伺服器收到關於打開的連接過多的錯誤。這是 Microsoft(R) 對修復完全不感興趣的錯誤。看這裡:
<http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711>
另外,如果您環顧四周,建議使用此程式碼來解決此問題:
smtpClient.ServicePoint.MaxIdleTime = 1; smtpClient.ServicePoint.ConnectionLimit = 1;好的,是的,這確實“解決”了連接保持打開狀態的問題。但是,如果您願意,這始終如一地在伺服器上嘗試,這會導致執行程序(在本例中為 w3wp.exe)的 CPU 跳躍並保持在 100%,直到您的應用程序池被回收。無論出於何種原因,執行 mscorwks.dll!CreateApplicationContext 的執行緒都是罪魁禍首。
這有一個非常好的副作用,如果您在一個對持續 100% 的 CPU 使用不滿意的 Web 主機上執行,您將禁用您的應用程序池。因此,這並不像某些人建議的那樣微不足道。
所以我的問題是怎麼辦?我需要做的就是這麼簡單;然而,讓那些“打開的連接太多”錯誤是不可接受的,100% 的 CPU 使用率也是不可接受的。我不想購買第三方組件,不是因為我便宜,而是我購買了足夠多的組件和 MSDN 訂閱,以至於不得不為簡單的 SMTP 功能支付 100 到 300 美元似乎很瘋狂。
我讀到將 MaxIdleTime 設置得更高會有所幫助,但我對此表示懷疑。我不想因為微軟不想遵循 SMTP 規範而冒險禁用我的應用程序池。
編輯: 我查看了 quiksoft.com 組件,但它不支持 SMTP 身份驗證,而且價格為 500 美元。一定有辦法解決這個問題。
我在所描述的設置中遇到了同樣的 CPU 使用率問題。我最終向 Microsoft 開了一張票,以確定問題的原因。CPU 使用率問題在於 ServicePoint 類。在 ServicePoint 類內部,有一個每 (MaxIdleTime/2) 毫秒執行一次的計時器。看到問題了嗎?通過將 MaxIdleTime 值更改為 2,CPU 使用率將下降到正常水平。
在 .NET 4.0 中,SmtpClient 現在是一次性的。SMTP QUIT 命令在處置時發出,例如在使用塊中使用時。