我需要设置一个Ruby / Rails应用程序,可以接受传入的电子邮件,电子邮件的主体将被忽略,每封电子邮件将有一个或多个大附件(图形)在20MB的大小,该应用程序将收到大约10-20这些电子邮件一小时。
我需要使用自定义电子邮件地址/域。
电子邮件的快速处理不是一个大的优先事项,但是每封电子邮件应该在到达后最多5分钟内得到处理。
我在考虑让所有的电子邮件自动从我的info@mydomain.com邮件帐户转发到一个GMail收件箱,然后让一个Rails库脚本使用MMS2R & TMail access GMail,下载任何新邮件并将它们添加到一个消息队列(延迟作业),这个脚本将由一个cron作业每分钟调用一次。
这个解决方案并不“很好闻”&我担心它的可伸缩性;我不想在每次运行cron / script时加载整个Rails堆栈。
有没有在Rails中处理传入邮件和附件的经验?
发布于 2011-08-30 14:38:48
如果您主要关心的是每分钟加载一次rails环境来运行脚本,我建议您使用mailgun和一些cron替代方案。
我使用bluepill + clockwork + delayed_job的组合来处理这个问题。我有自定义的工作,询问像Delayed::Job.enqueue MyJob.new一样简单。该逻辑被捕获在作业的perform方法中,这有助于最小化依赖关系。
clockwork用于将延迟的作业排入队列,仅加载最小的依赖项,从而保持最小的内存占用。
bluepill用于监视延迟的工人和时钟工作过程,并在他们发生故障或重新启动时重新启动。
一般内存使用: 20MB(bluepill) +25MB(发条)+80-90MB(延迟工作)
Clockwork.rb示例:
ENV['RAILS_ENV'] ||= "development"
ENV['RACK_ENV'] = ENV['RAILS_ENV']
require 'clockwork'
require 'mongoid'
require 'delayed_job'
require 'delayed_job_mongoid'
include Clockwork
base_directory = File.absolute_path(File.dirname(__FILE__))
require File.join(base_directory, "../jobs/fetch_comments_job.rb")
require File.join(base_directory, "../jobs/news_letter_job.rb")
Mongoid.load!(File.join(base_directory, "../config/mongoid.yml"))
every(1.minute, "pop.comments") { Delayed::Job.enqueue FetchCommentsJob.new}
every(1.day, "send.newsletter", :at => '22:30') { Delayed::Job.enqueue NewsLetterJob.new}发布于 2011-08-30 21:55:47
我写了一篇关于在Rails中接收电子邮件的可能选项的blog post。cron方法可以工作,但如果处理时间超过建议的5分钟,然后在旧实例仍在运行的情况下启动另一个实例,则可能会出现许多问题。
另一种方法是查看如何将电子邮件直接发送到web应用程序,这样您就可以使用现有的应用程序,而不必在每次运行cron任务时启动另一个实例。这样做显然也有潜在的缺点,但像CloudMailin这样的系统允许您将附件直接发送到S3来绕过这一问题。然后,您可以使用后台处理系统下载附件并调整它们的大小。
我还不得不modify paperclip一点让它来调整附件的大小。
https://stackoverflow.com/questions/7239131
复制相似问题