MSDN docs for SmptClient表示不保证实例成员是线程安全的(通过使用实例属性来存储像reference source中的MailWriter这样的东西。)
另一方面,this post(以及我的经验)表明,只为每封发送的电子邮件创建和处理SmtpClient,都可以让您轻松达到连接限制。
管理这些对象的最佳方法是什么?我是否必须手动创建池或使用信号量限制使用?或者,是否有一些更容易遵循的模式。我总是使用相同的邮件服务器。
答案 0 :(得分:1)
我建议使用持久的MessageQueue(如RabbitMQ)将事件和有效负载一起发送到该队列。我将编写一个消费者来读取该队列,并将其发送到一个电子邮件服务,该服务将处理发送,记录和引发您可能希望跟踪BI原因的其他电子邮件事件。
话虽如此,如果您每天发送数千封电子邮件,则需要验证您的IP地址以发送此类负载。此过程需要很长时间,但一旦IP经过认证,您就不会遇到任何问题。
答案 1 :(得分:1)
不要重新发明您已有的工具。查看 SmtpClient 类的 DeliveryMethod 属性。其中一个选项是让邮件自动排队,并通过 Microsoft SMTP服务 在后台传递。将DeliveryMethod设置为 PickupDirectoryFromIis ,并且消息将尽快写入队列邮件文件夹。然后,您所要做的就是配置Microsoft SMTP服务器以将外发邮件转发到本地邮件服务器,您就完成了。如果您使用邮件提取选项查找旧CDOSYS方法的引用,则其工作原理完全相同。
答案 2 :(得分:0)
帖子确实在正确的轨道上,为您发送的每封电子邮件创建了一个SmtpClient对象,这不是正确的方法。我所做的是设置一个队列。然后我启动了一个线程,它侦听队列中的任何消息,并使用相同的SmtpClient实例将它们发送出去。伪代码将是:
while (queue.HasEmails)
{
SendEmail()
}
WaitForAFlag // So we don't keep spinning
每次将一个项目添加到队列中时,只需 SetTheFlag ,这样线程就会再次开始读取队列。