我有一个.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/