通过RoR应用程序向用户发送电子邮件

时间:2011-04-14 00:51:49

标签: ruby-on-rails email actionmailer mailchimp

我正在建立一个论坛/ Q& A基于社区的应用程序的尾声,我想添加电子邮件通知。该应用程序有几个不同的实体,包括:线程,问题,项目,照片等。目标是用户可以“订阅”任意数量的这些实体,只要实体收到新的评论或活动,就会对电子邮件进行排队。此功能与facebook和论坛非常相似。

我调查了ActionMailer(使用rake任务和延迟作业),MailChimp API(和插件)以及其他应用程序邮件程序(PostageAppPostmark)。

我倾向于反对ActionMailer,因为内存占用和服务器过载的潜在问题。该应用程序将在Heroku上运行,但我担心服务器可能很容易被淹没,每隔几分钟就会发送数百封电子邮件。

另一个复杂性是根据用户偏好会有不同类型的订阅(即时电子邮件通知,每日电子邮件通知)。

管理此类功能的电子邮件的最佳方法是什么?任何提示/想法都非常感谢!

2 个答案:

答案 0 :(得分:2)

您可以使用ActionMailer与SendGrid或Postmark一起发送。 PostageApp仍然需要一个SMTP服务器并添加一个额外的依赖项,但它可能很好。 MailChimp仅适用于我所信的新闻通讯,所以这对你来说可能没用多少。

在这里给出一个高级概述,一些重要的事情是:

  1. 保持邮件程序逻辑不会混乱控制器。
  2. 防止延迟对用户请求的响应。
  3. 避免“应用程序过载”问题。
  4. 处理基于事件和定期发送的电子邮件。
  5. 要解决#1问题,您需要使用Observer来决定何时发送基于事件的电子邮件。要考虑#2和#3,您可以放入DelayedJob,以便在后台发送电子邮件。你可以很容易地在Heroku上使用带有ActionMailer的SendGrid(特别是如果你放入Pony)。对于#4,您应该创建一个rake任务来处理决定向谁发送电子邮件的业务逻辑,并将发送作业排队为像Observer那样的DJ任务。

    为了清楚起见,DelayedJob将在一个单独的进程中执行作业。对于Heroku,您实际上是在不同的Dyno中运行每个DelayedJob工作器,这是一个完全独立的堆栈/环境(很可能在不同的物理服务器上)。您的应用程序以这种方式过载不会有任何问题,除非您的数据库无法跟上添加作业(在这种情况下,您可以将Redis用作DJ商店)。您可以根据需要通过添加更多DJ工作人员轻松地进行水平扩展。

答案 1 :(得分:0)

查看SimpleWorker,一个基于云的后台处理/工作队列。

这是Heroku的附加组件,可以扩展和扩展以处理一组一次性帖子或预定的电子邮件。 (例如,可以安排一个主要工作,然后当它按计划运行时,它会将10s,100s,1000s的作业排队,并在一个扩展的基础设施上同时运行。)

Heroku工作人员可以正常工作,因为他们将作为单独的进程运行,但如果你有可变负载,那么你想要一个可以扩展和缩小工作的服务 - 所以你a)不支付未使用的容量和b)可以处理突发流量和批量输出。

(披露:我为公司工作。)