Dot-Net

在 .NET 中以高速率發送 SMTP 電子郵件

  • April 27, 2010

我有一個 .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 伺服器。

引用自:https://stackoverflow.com/questions/2713766