发送数千封不循环的个人邮件

本文关键字:循环 | 更新日期: 2023-09-27 18:13:58

我有一个网站,人们在上面出售东西。每个月,每个有出售物品的用户都会收到一封来自windows服务的电子邮件,询问他们的物品是否已售出,并给他们一个自定义链接,让他们点击以确认未售出(因为这违反了用户协议,即已售出的物品将留在网站上)。

首先,我必须运行一个查询来获得所有未售出的商品和相关用户的电子邮件。目前,我正在循环所有这些,并为每个人生成自定义电子邮件,并将它们作为单独的电子邮件发送出去。

   foreach (Item unsoldItem in unsoldItemsCollection)
        {
          //generate email
           string email = GenerateUnsoldEmail(itemName, itemPrice);
           Utils.Sendemail(unsoldItem .UserEmail, "no-reply@website.com", "Unsold Item", email);
        }

(这是一种伪代码,但这就是我所做的)

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

我还能怎么做呢?

咳嗽

发送数千封不循环的个人邮件

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

你不能邮件合并,因为所有的电子邮件是不同的;里面的链接会不一样…除非电子邮件正文有某种登陆页面,强迫用户登录,然后将用户重定向到一个特定的页面,在那里列出了用户的所有商品,并要求他删除已经出售的商品。在这种情况下,你可以发送一封电子邮件而不是数千封。

SmtpClient有一个异步版本的Send方法

如果您想对集合中的每个项做一些事情,则必须使用某种循环(或类似的东西,如递归)。这是没有办法的。

你应该停止担心潜在的问题。如果你认为这段代码会有性能问题,那就测量一下,看看它到底有多快,能处理多少封邮件。

你担心可能要花几个小时来发送所有的电子邮件。这真的是个问题吗?为什么?

你还担心它可能占用太多内存。如果你不能一次把所有的条目都放入内存中,你应该分批处理它们:例如一次获取1000个条目,处理它们,然后再获取另外1000个条目。

你可以创建一个每天发送一次邮件的windows服务。

或者,更简单的是,您可以创建一个小的控制台实用程序来做同样的事情,并将其作为计划任务运行。