有没有办法在 Play 框架中限制发送的电子邮件?

Posted

技术标签:

【中文标题】有没有办法在 Play 框架中限制发送的电子邮件?【英文标题】:Is there a way to Rate Limit Sent Emails in Play Framework? 【发布时间】:2013-04-09 17:29:19 【问题描述】:

如何实现 RateLimit 以通过 play.mvc.Mailer 发送电子邮件?

我正在为我的游戏框架 1.2.5 应用程序实施 SES 以替换 GMAIL。该应用程序会遇到一次可能发送 200 封电子邮件(通知)的情况,因此我需要将它们的速率限制为 5 个收件人/秒。亚马逊推荐 Google Guava 的 RateLimit 类 (http://sesblog.amazon.com/post/TxKR75VKOYDS60/How-to-handle-a-quot-Throttling-Maximum-sending-rate-exceeded-quot-error)。我目前正在扩展 Play 的 Mailer 类。如果我尝试调用自己的发送方法,例如 sendWithRateLimit(Object...args),我会丢失使用 play 的 LocalvariablesNamesEnhancer 类获取的上下文,因此它不知道要调用哪个模板。

非常感谢任何帮助。

【问题讨论】:

好像 Play 是无状态/可扩展的,我第二次考虑我的 RateLimit 方法,我可能会创建一个电子邮件服务器来处理所有电子邮件并处理速率限制,我会在它出现时发布我的解决方案完成了。 【参考方案1】:

现在为时已晚,但这样做的方法是:

    创建一个代表您的电子邮件的模型,我们称之为Email,将它们保存到数据库中 创建一个获取下 X 个 Email 记录的作业,并计划以允许的速率运行 对于每个 Email 记录,使用邮件程序发送电子邮件

【讨论】:

是的,我开始这样做,但这对我来说不值得。此外,该作业还必须存在于它自己的服务器上,以便与 Web 服务器分开,以防我需要启动多个实例。 它不必是单独的服务器,但您是对的,您需要注意两台服务器不要同时运行相同的作业。将作业/电子邮件队列存储在数据库中使得多个服务器/dynos 成为可能。 我在自己的应用程序(单独的服务器)中运行它的原因是因为否则我需要根据正在运行的测功机数量动态计算 RateLimiter 的持续时间。例如,如果我需要限制 SES 每秒发送 10 封电子邮件,如果有 10 台服务器,他们可能每秒发送 100 封电子邮件。【参考方案2】:

我在这条路上走了大约 6 个小时,并意识到为了利用 SES,我编写了太多代码。我们将改用 Mandrill 的 Heroku 插件:https://addons.heroku.com/mandrill

【讨论】:

以上是关于有没有办法在 Play 框架中限制发送的电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

play框架使用起来(17)

play框架使用起来(17)

有没有办法限制客户端在 Python 聊天室应用程序中发送的消息数/秒?

使用 Play 框架的 JMS/ActiveMQ 异常

Play Framework 2.4 发送邮件

Google Play 中的内部测试不发送电子邮件