将电子邮件传递到 Rails 应用程序的最佳方式

将电子邮件传递到 Rails 应用程序的最佳方式

我正在考虑一个系统的架构,该系统应该处理传入的邮件并将其传递给处理传入邮件的 rails 应用程序。我不确定做这样的事情的最佳方法是什么。

它应该像这样工作:

  • 邮件发送至 contact@user_id.myapp.com 等地址
  • 邮件服务器接受邮件并将其传递给 rails 应用程序(或存储它们并由 rails 应用程序获取它们)
  • rails 应用程序处理邮件(进行一些分析然后将它们放入数据库中)

它基本上应该像 queque 一样工作。邮件流量突然激增不应该导致 rails 应用程序停止运行。

我并不是在寻找完整的解决方案。我只是对您的意见感兴趣。我想出了 3 个可能的选择:

  • Rails 通过 Pop3 连接到邮件服务器并下载邮件(可能很慢)
  • 邮件服务器通过 POST 请求将邮件发送到 rails APP(可能也太慢了,遇到邮件炸弹可能会杀死网络服务器)
  • maildir 实际上链接到 rails 应用服务器的文件系统(邮件服务器和应用服务器必须分开)并且 rails 直接从中读取。

您认为从性能和安全角度来看,最好的方法是什么?我是否遗漏了什么?有没有更好的方法?您现在有一些最佳实践资源吗?

谢谢!

答案1

以下帖子或许能有所帮助:

使用 Rails 接收电子邮件和附件

本文还包含有关设置 RailsCron 的先前帖子的链接。

答案2

我见过应用程序使用 POP3 来实现这一点(我能想到的一个例子就是 Spiceworks)。我认为这是将应用程序服务器与邮件服务器分开的好方法,并且允许您让邮件服务器专注于它擅长的事情,并将客户端从消息的排队/存储任务中解放出来。

回复:安全

想到的 POP3 的一个问题是默认使用明文凭证。如果您可以通过 SSL(依赖于邮件服务器)运行它,则可以减轻这种担忧。

回复:性能和扩展

我不太确定 POP3 访问是否会变得如此缓慢。我对在文件系统级别进行集成持谨慎态度,因为当新邮件进入时,您可能会遇到争用和锁定问题(呃——想想通过 NFS 安装邮件目录,这是有趣的文件系统争用问题的一个例子)。POP3 为您提供了一种很好的方法来自动访问邮箱中的项目。

让多个消费者同时在同一个 POP3 邮箱上运行可能会有问题(如果您尝试扩展以处理更多消息流量)。为此,您可能需要在邮件服务器端编写一些脚本,以循环方式将传入的消息分发到一组邮箱中,并将每个消费者绑定到给定的邮箱。(您可能会考虑使用 IMAP 来实现多消费者架构,但这只是我胡说八道,没有仔细考虑。)

当然,与直接将 SMTP 接受到代码中相比,您添加了更多层和潜在瓶颈,但您充分利用了邮件服务器作者已经完成的所有工作。不过,我宁愿在邮件服务器上遇到扩展问题,也不愿在自定义 SMTP 服务器代码上遇到扩展问题。

答案3

Rails 可能不是完成这项工作的合适工具。您可能想编写一个小脚本,在 stdin 上接受电子邮件并将其插入到数据库中。您可能能够使用相同的 ActiveRecord 代码来执行此操作。然后,您只需设置 MTA 以通过将邮件传送到脚本来传递邮件即可。

如果您需要更高的性能,您可以将脚本重写为通过 LTMP 接受电子邮件的守护进程,这将节省为每封邮件启动一个进程的低效率。

答案4

不要使用 POP(如果您选择这种方式),而是使用 IMAP(S)。这样,一旦采取行动,您就可以将服务器上的内容保留为“已读”。

相关内容