发送数以千计的个人电子邮件而不会循环播放

时间:2011-11-10 13:46:59

标签: c# asp.net email loops

我有一个网站,人们把东西出售。 每个月,每个有待售物品的用户都会收到一个Windows服务的电子邮件,询问他们的商品是否已经售出,并给他们一个自定义链接点击确认它没有(因为这违反了用户协议的项目留在销售的网站上。

首先,我必须运行查询以获取所有未售出的项目以及相关用户的电子邮件。 目前,我正在循环所有这些并为每个人生成自定义电子邮件,并将其作为单独的电子邮件发送出去。

   foreach (Item unsoldItem in unsoldItemsCollection)
        {
          //generate email

           string email = GenerateUnsoldEmail(itemName, itemPrice);
           Utils.Sendemail(unsoldItem .UserEmail, "no-reply@website.com", "Unsold Item", email);

        }

(这是一种伪代码,但这正是我正在做的事情)

我的问题是,该循环中可能有数千个(如果它起飞,可能是数百万:) :)所有需要电子邮件的项目,我认为这会导致问题。

我还有什么方法可以做到这一点?

贝克斯

3 个答案:

答案 0 :(得分:2)

我会异步执行此操作,以便在发送当前电子邮件之前不会暂停程序。

由于所有电子邮件都不同,您无法进行邮件合并;其中的链接将是不同的...除非电子邮件的正文具有强制用户登录的某种登录页面,然后将用户重定向到特定页面,其中列出了用户的所有项目并且他被要求删除已售出的。在这种情况下,您可以发送电子邮件而不是数千。

SmtpClient has an async version of the Send method

答案 1 :(得分:0)

如果你想为集合中的每个项目做一些事情,你将不得不使用某种循环(或类似的东西,如递归)。没有办法解决这个问题。

你应该不再担心潜在的问题。如果您认为此代码存在性能问题,请对其进行测量,并了解其实际速度和处理的电子邮件数量。

您担心发送所有电子邮件可能需要数小时。这真的是个问题吗?为什么呢?

你也担心它可能会占用太多内存。如果你不能同时将所有项目都装入内存,你应该批量处理它们:例如一次获得1000个,处理它们,然后再获得1000个。

答案 2 :(得分:0)

您可以创建一个Windows服务,每天发送一次所有电子邮件。

或者,更简单的是,您可以创建一个小型控制台实用程序,它可以执行相同操作并将其作为计划任务运行。