【问题标题】:How to best manage SMTP clients如何最好地管理 SMTP 客户端
【发布时间】:2015-06-10 20:26:11
【问题描述】:

MSDN docs for SmptClient 表示不能保证实例成员是线程安全的(通过使用实例属性来存储诸如 reference source 中的 MailWriter 之类的东西而产生)。

另一方面,this post(和我的经验)表明,简单地为每封发送的电子邮件创建和处理一个 SmtpClient 可能会导致您很容易达到连接限制。

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

【问题讨论】:

  • 您是一次发送几封电子邮件还是数百封(或更多)?我使用队列来存储消息,并有一个单独的服务接收消息并通过邮件服务发送出去
  • 不要从多个线程访问它们。多田。如果需要,缓存您的电子邮件并让工作人员每 X 分钟刷新一次缓存。双塔达。最后一件事,加强缓存以防止应用程序重新启动。贵族。

标签: c# email smtpclient


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你的意思是 PickupDirectoryFromIis 吗?另外,如果您使用这种方法,您如何处理您的 SmtpClient 对象?每次都新建一个并丢弃?
    • @ChaseMedallion 正确,我进行了编辑以修复上面的错字。是的,以这种方式使用它,您对 SmtpClient 的调用只是写入本地文件系统队列。这消除了任何此类问题,并停止由于与目标邮件服务器的网络连接活动而导致的阻塞,这些活动现在将在完全独立的进程上与您的代码异步发生。
    【解决方案3】:

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

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

    每次将一个项目添加到队列中时,您只需 SetTheFlag 这样线程就会再次开始读取队列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多