我有一个.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服务器的一个连接,而将具有许多并发连接。传入的电子邮件从队列中取出,并分派(dispatch)到工作线程池中,该工作线程调用SmtpClient.Send()将消息发送到SMTP服务器。

我做了一些基本的测试,发现它可以将性能提高多达100%。但是,并发连接的最佳数量和实际性能的提高可能很大程度上取决于SMTP服务器。扩展此想法的一种方法是连接到多个SMTP服务器。

关于.net - 在.NET中以高速率发送SMTP电子邮件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2713766/

10-10 16:30