在.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服务器.

相关文章
相关标签/搜索