ASP.NET - 并行发送批量邮件 - 最快最有效的方式
ASP.NET - Send bulk mail in parallel - fastest and most efficient way
我想向我们网站的注册用户发送时事通讯 - 超过 100000
今天,我在一个简单的 for
循环中发送邮件,非常繁重和缓慢。
我希望它尽快完成该过程(即使该过程会 运行 在后台并且不会打扰用户的 UI)
我尝试了 TPL
、Async
、smtpClient.SendAsyncMail()
等等,但从来没有真正创建一个工作示例来证明这些系统工作得更快(或根本工作)。
我已经阅读了很多使用线程的帖子和解释,但它们似乎是旧的、已弃用的或无关紧要的,因为有一些我肯定不知道的新技术。
你能告诉我并行发送多封电子邮件的最有效和最快的方法是什么吗?你能告诉我一个有效的例子吗?
2018 年 6 月 20 日更新
每个用户的每封电子邮件都不同。因此密件抄送解决方案与我无关。
我会详细说明我的问题:
我只关注使用发送功能的高级,例如 ASP.NET smtpClient.Send()
将邮件发送到 SMTP。
我暂时忽略 SMTP 本身的部分。我有一个很棒的 SMTP 服务器,它知道如何处理排队。
现在的主要陷阱是将字节上传到 ASP.NET 中的 SMTP 服务器的发送函数。
那就是我找不到更快发送的方法的地方。 (不用说,如果我买一个更强大的服务器,即使是迭代方法也会更快)
但我想要一个可扩展的解决方案 - 一个更智能的解决方案,我可以在其中并行发送大量邮件。
更新 28/06/2018
显然并行解决方案无法解决我的问题。正如@Terry Carmen 和其他人所解释的那样,我可能不得不看看这个过程中的其他瓶颈。谢谢大家的帮助!
多么棒的社区!!!
将用户作为密件抄送收件人添加到邮件中,让邮件服务器完成工作。
邮件服务器可能有密件抄送限制,因此您可能需要查看服务器的限制并批处理请求。
编辑
关于"sending in parallel"
您正在寻找错误的答案。如果您的机器需要 X 秒来生成 Y 封电子邮件,运行 它们 "in parallel" 将无法解决任何问题。您最多要做的就是在几个内核之间拆分生成,这可能会稍微提高性能,但几乎可以肯定不是问题。
你需要看看 "what the actual slow part is"。它可能是您的磁盘或 CPU 或网络连接,或数据库服务器或可能是邮件服务器上的速率限制设置。实际的 SMTPClient 对象几乎肯定不是问题所在。
另一个编辑
您可以尝试通过 运行 单独线程中的单独 SMTPClient 实例并行发送;然而,这不太可能真正帮助你。
正如我自己和其他人之前提到的,您假设并行发送是某种灵丹妙药。不是。有些东西限制了你的速率,几乎可以肯定你不是单线程的。
我想向我们网站的注册用户发送时事通讯 - 超过 100000
今天,我在一个简单的 for
循环中发送邮件,非常繁重和缓慢。
我希望它尽快完成该过程(即使该过程会 运行 在后台并且不会打扰用户的 UI)
我尝试了 TPL
、Async
、smtpClient.SendAsyncMail()
等等,但从来没有真正创建一个工作示例来证明这些系统工作得更快(或根本工作)。
我已经阅读了很多使用线程的帖子和解释,但它们似乎是旧的、已弃用的或无关紧要的,因为有一些我肯定不知道的新技术。
你能告诉我并行发送多封电子邮件的最有效和最快的方法是什么吗?你能告诉我一个有效的例子吗?
2018 年 6 月 20 日更新
每个用户的每封电子邮件都不同。因此密件抄送解决方案与我无关。
我会详细说明我的问题:
我只关注使用发送功能的高级,例如 ASP.NET smtpClient.Send()
将邮件发送到 SMTP。
我暂时忽略 SMTP 本身的部分。我有一个很棒的 SMTP 服务器,它知道如何处理排队。
现在的主要陷阱是将字节上传到 ASP.NET 中的 SMTP 服务器的发送函数。 那就是我找不到更快发送的方法的地方。 (不用说,如果我买一个更强大的服务器,即使是迭代方法也会更快)
但我想要一个可扩展的解决方案 - 一个更智能的解决方案,我可以在其中并行发送大量邮件。
更新 28/06/2018
显然并行解决方案无法解决我的问题。正如@Terry Carmen 和其他人所解释的那样,我可能不得不看看这个过程中的其他瓶颈。谢谢大家的帮助! 多么棒的社区!!!
将用户作为密件抄送收件人添加到邮件中,让邮件服务器完成工作。
邮件服务器可能有密件抄送限制,因此您可能需要查看服务器的限制并批处理请求。
编辑
关于"sending in parallel"
您正在寻找错误的答案。如果您的机器需要 X 秒来生成 Y 封电子邮件,运行 它们 "in parallel" 将无法解决任何问题。您最多要做的就是在几个内核之间拆分生成,这可能会稍微提高性能,但几乎可以肯定不是问题。
你需要看看 "what the actual slow part is"。它可能是您的磁盘或 CPU 或网络连接,或数据库服务器或可能是邮件服务器上的速率限制设置。实际的 SMTPClient 对象几乎肯定不是问题所在。
另一个编辑
您可以尝试通过 运行 单独线程中的单独 SMTPClient 实例并行发送;然而,这不太可能真正帮助你。
正如我自己和其他人之前提到的,您假设并行发送是某种灵丹妙药。不是。有些东西限制了你的速率,几乎可以肯定你不是单线程的。