我想向我们网站的注册用户发送简报 - 超过100000
今天,我将邮件发送到一个简单的for
循环中,这个循环非常繁重而且很慢。
我希望它能够尽快完成整个过程(即使该过程在后台运行并且没有打扰用户的UI)
我尝试了TPL
,Async
,smtpClient.SendAsyncMail()
等等,但实际上从未创建过一个可以证明这些系统工作速度更快(或根本不工作)的工作示例。
我已经阅读了许多使用线程的帖子和解释,但它们似乎已经过时,已弃用或无关紧要,因为我肯定不知道有新技术。
您能否告诉我,并行发送多封电子邮件的最有效,最快捷的方法是什么?你能告诉我一个有效的例子吗?
更新20/06/2018
每个用户的每封电子邮件都不同。因此,BCC解决方案对我来说无关紧要。
我会再详细说明一下我的问题:
我只专注于使用发送功能的高级别,例如ASP.NET smtpClient.Send()
将邮件发送到SMTP。
我现在忽略了SMTP本身的一部分。我有一个很棒的SMTP服务器,知道如何处理排队。
现在的主要缺陷是Send函数,它将字节上传到ASP.NET中的SMTP服务器。 那是我无法找到更快发送方式的地方。 (可以说,如果我购买更强大的服务器,即使迭代方法也能更快地运行)
但我想要一个可扩展的解决方案 - 一个更智能的解决方案,我可以在其中并行发送大量邮件。
更新28/06/2018
显然并行解决方案无法解决我的问题。正如@Terry Carmen和其他人所解释的那样,我可能不得不在这个过程中看看其他瓶颈。谢谢大家的帮助! 多么棒的社区!!!
答案 0 :(得分:1)
将用户作为密件抄送收件人添加到邮件中,并让邮件服务器完成工作。
邮件服务器可能具有密件抄送限制,因此您可能必须查看服务器的限制并分批处理请求。
修改
关于“并行发送”
您正在寻找错误的答案。如果您的计算机花X秒才能生成Y封电子邮件,则“并行”运行它们将无法解决任何问题。您最多要做的是将世代划分成几个内核,这可能会稍微提高性能,但是几乎可以肯定这不是问题。
您需要查看“实际的慢速部分是什么”。它可能是您的磁盘,CPU或网络连接,数据库服务器或邮件服务器上的速率限制设置。几乎可以肯定,实际的SMTPClient对象不是问题。
另一项修改
您可以尝试通过在单独的线程中运行单独的SMTPClient实例来并行发送;但是,这不太可能对您有实际帮助。
正如我自己和其他人之前提到的,您假设并行发送是某种魔术子弹。不是。某些事情限制了您的速率,并且几乎可以肯定不是您是单线程的。