如何最好地管理 SMTP 客户端

本文关键字:SMTP 客户端 管理 何最好 | 更新日期: 2023-09-27 17:55:29

SmptClient 的 MSDN 文档说,实例成员不能保证是线程安全的(通过使用实例属性在引用源中存储 MailWriter 之类的东西而诞生的)。

另一方面,这篇文章(以及我的经验)表明,简单地为发送的每封电子邮件创建和处置SmtpClient可以让您很容易达到连接限制。

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

如何最好地管理 SMTP 客户端

我建议使用持久 MessageQueue(如 RabbitMQ)将事件和有效负载发送到该队列。 我将编写一个使用者来读取该队列,并将其发送到电子邮件服务,该服务将处理发送、记录和引发您可能出于 BI 原因想要跟踪的其他电子邮件事件。

话虽如此,如果您每天发送数千封电子邮件,则需要证明您的 IP 地址才能发送此类负载。 此过程需要很长时间,但是一旦该IP获得认证,您应该不会遇到任何问题。

不要重新发明你已经可用的工具。查看 SmtpClient 类的 DeliveryMethod 属性。其中一个选项是让邮件自动为您排队,并通过Microsoft SMTP服务在后台传递。将"传递方法"设置为"PickupDirectoryFromIIS",邮件将以最快的速度写入队列邮件文件夹。然后,您所要做的就是配置Microsoft SMTP服务器以将外发邮件转发到本地邮件服务器,您就完成了。如果您使用邮件取件选项查找对旧 CDOSYS 方法的引用,则其工作方式完全相同。

这些帖子确实在正确的轨道上,为您发送的每封电子邮件创建一个 SmtpClient 对象并不是正确的方法。 我所做的是设置一个队列。 然后,我启动了一个线程,该线程侦听队列中的任何消息,并使用相同的SmtpClient实例将它们发送出去。 伪代码将是:

while (queue.HasEmails)
{
    SendEmail()
}
WaitForAFlag // So we don't keep spinning

每次将项目添加到队列中时,您只需 SetTheFlag 即可,以便线程再次开始读取队列。