如何最好地管理SMTP客户端

时间:2015-06-10 20:26:12

标签: c# email smtpclient

MSDN docs for SmptClient表示不保证实例成员是线程安全的(通过使用实例属性来存储像reference source中的MailWriter这样的东西。)

另一方面,this post(以及我的经验)表明,只为每封发送的电子邮件创建和处理SmtpClient,都可以让您轻松达到连接限制。

管理这些对象的最佳方法是什么?我是否必须手动创建池或使用信号量限制使用?或者,是否有一些更容易遵循的模式。我总是使用相同的邮件服务器。

3 个答案:

答案 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 ,这样线程就会再次开始读取队列。