Dot-Net
在 .NET 中以高速率發送 SMTP 電子郵件
我有一個 .NET 服務,它在後台執行緒上處理隊列,並從隊列中的項目以非常高的速率發送大量小型電子郵件消息(如果可能的話,每秒發送 100 條消息)。目前,我使用,
SmtpClient.Send()但我擔心它可能會影響性能。每次呼叫
Send()都會經歷一個完整的循環,即打開套接字、執行 SMTP 會話(HELO、MAIL FROM、RCPT TO、DATA)和關閉套接字。在虛擬碼中:for each message { open socket send HELO send MAIL FROM send RCPT TO send DATA send QUIT close socket }(編輯:這個陳述
SmtpClient.Send()實際上是錯誤的,正如我在回答中所解釋的那樣。)我認為以下虛擬碼會更優化:
open socket send HELO for each message { send MAIL FROM send RCPT TO send DATA } send QUIT close socket我是否應該關注
SmtpClient.Send()高速發送電子郵件時的性能?我有哪些優化性能的選擇?
該類
SmtpClient在後台記憶體 SMTP 伺服器連接。重複呼叫SmtpClient.Send()以將多條消息送出到同一個 SMTP 伺服器將有效地執行第二個範例中的虛擬碼。提高性能的一種方法可能是使用
SmtpClient在多個執行緒上執行的多個實例。該服務現在將擁有許多並發連接,而不是只有一個與 SMTP 伺服器的連接。傳入的電子郵件消息從隊列中取出並分派到一個工作執行緒池,該執行緒池呼叫SmtpClient.Send()以將消息發送到 SMTP 伺服器。我做了一些基本的測試,發現這可以將性能提高多達 100%。但是,最佳並發連接數和實際性能改進可能在很大程度上取決於 SMTP 伺服器。擴展這個想法的一種方法是連接到多個 SMTP 伺服器。