我需要设置一个Ruby / Rails应用程序,它可以接受传入的电子邮件,电子邮件的主体将被忽略,每封电子邮件将有一个或多个大小高达20MB的大型附件(图形),应用程序将收到大约这些电子邮件每小时10-20个。
我需要使用自定义电子邮件地址/域名。
快速处理电子邮件并非当务之急,但每封电子邮件应在收到后最多5分钟内处理完毕。
我想将所有电子邮件自动从我的info@mydomain.com邮件帐户转发到GMail收件箱,然后让Rails lib脚本使用MMS2R& TMail访问GMail,下载任何新邮件&将它们添加到消息队列(延迟作业),这个脚本将由cron作业每分钟调用一次。
这个解决方案并没有“闻到正确”和我会担心它的扩展能力;我不希望每次运行cron /脚本时都加载整个Rails堆栈。
有没有人有接收邮件的经验& Rails中的附件处理?
答案 0 :(得分:0)
如果您主要担心的是每分钟加载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}
答案 1 :(得分:0)
我写了一篇关于在Rails中接收电子邮件的许多可能选项的blog post。 cron方法有效,但是如果处理时间超过建议的5分钟,然后再转动另一个实例,而旧的实例仍在运行,则会出现一些问题。
备选方案着眼于如何将电子邮件直接发送到您的Web应用程序,以便您可以使用现有应用程序,而不必在每次运行cron任务时启动另一个实例。这样做显然有潜在的缺点,但像CloudMailin这样的系统允许您将附件直接发送到S3来解决这个问题。然后,您可以使用后台处理系统下载附件并调整其大小。
我还需要modify paperclip一点来调整附件的大小。