如何在单独触发每封电子邮件时,避免向同一个人发送多封电子邮件

时间:2011-08-04 02:22:12

标签: c# .net asp.net

我有一个网站让用户批准其他用户访问某些内容。我想要做的是在他们的访问权限获得批准后向该用户发送电子邮件。

每个访问项都在gridview中,并有一个用户点击的批准按钮。

问题在于,如果要完成10个批准,我不希望向用户发送10封电子邮件。 我只想发送一封电子邮件。

这在某种程度上要求延迟电子邮件程序,并将其分组..

有没有人知道一个简单明了的方法呢?

3 个答案:

答案 0 :(得分:2)

您可以创建一个数据库,用于存储有关用户有权访问哪个项目的信息。

创建一个User表,一个Item表和一个在User和Item之间建立关系的中间表。

当某人有权访问另一个项目时,您可以查询数据库,以了解此人是否已经有权访问该项目,然后再发送电子邮件!

只是一个想法......也就是说,如果有一个数据库是一个选项,否则......我必须多想想......让我知道! =)

答案 1 :(得分:1)

我可以在这里想到两种简单的方法:

  1. 请勿在用户点击时发送电子邮件,而是每30分钟左右发送一封电子邮件。这将需要某种脚本,每30分钟运行一次,以检查需要发送的电子邮件,然后发送并发送电子邮件。这可能是最好的方法,但有点难。如果您的脚本定期运行(每分钟左右),您可以将此扩展一点,以便仅向不活动的用户发送电子邮件,如果您真的想避免发送多封电子邮件。

  2. 批量发送电子邮件,以便当存储的电子邮件数量达到(例如)10个用户的电子邮件时,将发送该用户的所有电子邮件。这有一个潜在的主要缺点(取决于您的预期用途),有些电子邮件可能被大量延迟或根本没有发送(如果用户只被要求批准1件事),所以你真的不应该这样做,除非你是100%肯定这种情况永远不会发生(例如,所有用户要求每天至少批准10件物品),即便如此,我也建议不要这样做。

  3. 无论您选择哪种方式,您都需要存储仍需要以某种方式发送的电子邮件,而且我在这里无法提供太多建议,因为我不确定您的具体细节设置。

    更新:由于您使用的是c#,因此您将拥有一个支持您网站的数据库(例如Microsoft SQL Server),可能还有一个供用户使用的表格。我假设它被称为Users并且有一个id列作为其主键,还有一个email列,用于记录该用户的当前电子邮件地址:

    1. 创建一个Emails表,其中包含id(主键),user_id(外键代表users表中的用户条目)和{{1}的列(您要发送的电子邮件的文本)。

    2. 每次您通常都会发送电子邮件,而是在email_text表中添加记录,Emails指向user_id表中的正确记录。< / p>

    3. 编写单独的C#(或其他语言)应用程序/脚本,执行以下操作:

      1. Users表中获取1条记录及其相应的用户条目,使用类似于:

        Emails(我没有便于测试的SQL服务器,因此请根据需要调整语法)

      2. 根据您从数据库中提取的信息发送电子邮件

      3. SELECT users.email, emails.email_text FROM users, emails WHERE user.id = email.user_id LIMIT 1;表格

      4. 删除记录
      5. 如果您要发送更多电子邮件,请返回(子)步骤1.

    4. 设置一个计划任务(或Cron任务,如果有人试图将其应用于非Windows部署),每30分钟运行一次C#应用程序(或您选择的任何语言)。< / p>

答案 2 :(得分:1)

最简单的选择,只需很少的重新分解,就是:

  • 将电子邮件存储在数据库中而不是发送。要以非常简单的方式将它们存储在数据库中,只需创建一个包含电子邮件/主题/正文的表格并在那里发送信息。

  • 存储后,您需要一个触发器来发送电子邮件。

    • 如果您希望将其安排为每30分钟发送一次,则需要创建一个服务或预定程序来执行此操作。最好的方法是使用带有计时器的服务。

    • 如果电子邮件不是那么重要,您可以让它由队列触发。像上面提到的例子;当您插入新的电子邮件记录时,请检查是否有10个,如果有,则将其发送出去。

  • 发送电子邮件后,删除记录或将其标记为已发送。