首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免在每封邮件都被单独触发的情况下给同一个人发送多封邮件

如何避免在每封邮件都被单独触发的情况下给同一个人发送多封邮件
EN

Stack Overflow用户
提问于 2011-08-04 10:22:12
回答 3查看 1.2K关注 0票数 1

我有一个网站,可以让一个用户允许另一个用户访问某些内容。我想要做的是,当他们的访问权限已被批准时,发送一封电子邮件给该用户。

每个访问项都在一个网格视图中,其中有一个可供用户单击的批准按钮。

问题是,我不希望10个电子邮件发送给用户,如果他们有10个审批完成。我只想发送一封电子邮件。

不知何故,这需要延迟电子邮件过程,并对其进行分组。

有没有人知道一种既好又简单的方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-04 10:35:22

这里有两种简单的方法:

  1. 不在用户点击时发送电子邮件,而是每30分钟左右发送一封电子邮件。这将需要某种类型的脚本,该脚本每30分钟运行一次,以检查需要发送哪些电子邮件,然后该脚本发出并发送电子邮件。这可能是最好的方法,但有点困难。如果你的脚本定期运行(每分钟左右),只发送非活动的电子邮件用户,如果你真的想避免发送多封电子邮件,你可以稍微扩展一下。
  2. 批量处理电子邮件,这样当存储的电子邮件数量达到(例如)用户的10封电子邮件时,该用户的所有电子邮件都会被发送。这有一个潜在的主要缺点(取决于你的预期使用),一些电子邮件可能会被大量延迟或根本不发送(如果用户只被要求批准一件事情),所以你真的不应该这样做,除非你百分之百确定这永远不会发生(例如,所有用户要求每天至少批准10个项目),即使这样,我也建议不要这样做。

不管你选择哪种方式,你都需要存储哪些电子邮件仍然需要以某种方式发送,我在这里真的不能给出太多建议,因为我不确定你设置的细节。

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

  1. 创建一个Emails表,其中包含id (主键)、user_id (表示用户表中用户条目的外键)和email_text (要发送的电子邮件的文本)列。
  2. 每次正常发送电子邮件时,都会向Emails表中添加一条记录,其中D20指向Users表中的正确记录。
  3. 编写一个单独的C# (或其他语言)应用程序/脚本,该应用程序/脚本执行以下操作:H224G225

代码语言:javascript
复制
1. Get 1 record from the `Emails` table, and its corresponding user entry, using something like:

SELECT users.email, emails.email_text FROM users, emails WHERE user.id = email.user_id LIMIT 1; (我手头没有要测试的SQL server,所以可以根据需要调整语法)

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

3.从Emails表中删除记录

4.如果您有更多电子邮件要发送,请返回(sub)步骤1。

  1. 设置一个计划任务(或Cron任务,如果有人尝试将其应用于非windows部署),该任务每30分钟运行一次C#应用程序(或您选择的任何语言)。
票数 1
EN

Stack Overflow用户

发布于 2011-08-04 10:33:29

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

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

当某人将另一个项目的访问权限授予某个项目时,您可以查询数据库以了解此人之前是否已经访问过该项目,然后发送一封电子邮件!

只是一个想法..。也就是说,如果可以选择拥有数据库,否则...我得多想想..。让我知道!=)

票数 2
EN

Stack Overflow用户

发布于 2011-08-04 12:33:31

最简单的选择,只要很少的重构,就是:

  • 将电子邮件存储在数据库中,而不是发送。要以一种非常简单的方式将它们存储在数据库中,只需创建一个包含email/subject/body的表并将信息发送到那里。
  • 在存储之后,您将需要一个触发器来发送电子邮件。

代码语言:javascript
复制
- If you want to schedule it to send every 30 minutes, you will need to have a service or scheduled program created to do this.  Best way to do it would be to use a service with a timer in it.
- If the emails are not that crucial, you can have it triggered by a queue.  Like the example mentioned above; when you insert a new email record, check to see if there are 10, if there are, then send it out.

  • 发送电子邮件后,删除记录或将其标记为已发送。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6935493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档