在.NET中以高速率发送SMTP电子邮件

Mar*_*age 9 .net email 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
}
Run Code Online (Sandbox Code Playgroud)

(编辑:这句话SmtpClient.Send()实际上是假的,正如我在答案中解释的那样.)

我认为以下伪代码将更加优化:

open socket
send HELO
for each message {
  send MAIL FROM
  send RCPT TO
  send DATA
}
send QUIT
close socket
Run Code Online (Sandbox Code Playgroud)

我是否应该关注SmtpClient.Send()高速发送电子邮件时的表现?我有哪些优化性能的选择?

Mar*_*age 8

SmtpClient班是缓存在幕后SMTP服务器的连接.SmtpClient.Send()反复调用以向同一SMTP服务器提交多个消息将有效地执行第二个示例中的伪代码.

提高性能的一种方法可能是SmtpClient在多个线程上使用多个运行实例.该服务现在具有许多并发连接,而​​不是仅与SMTP服务器建立一个连接.从队列中获取发送的电子邮件消息并将其分派到调用SmtpClient.Send()将消息发送到SMTP服务器的工作线程池.

我做了一些基本的测试,发现这可能会使性能提高100%.但是,最佳并发连接数和实际性能改进可能非常依赖于SMTP服务器.扩展此想法的一种方法是连接到多个SMTP服务器.