2011-08-30 19 views
3

我需要設置一個可以接受傳入郵件的Ruby/Rails應用程序,電子郵件的主體將被忽略,每個電子郵件將有一個或多個大型附件(圖形),大小爲20MB,應用程序將接收大約10這些電子郵件中有20封是一小時。如何處理來自Rails應用程序的具有多個大附件的傳入電子郵件?

我需要使用自定義電子郵件地址/域。

電子郵件的快速處理並不是一個重要的優先事項,但每個電子郵件應該在到達後最多5分鐘內得到處理。

我想有從我[email protected]郵件帳戶自動轉發到Gmail收件箱的所有電子郵件,那麼有一個Rails的lib腳本使用MMS2R & TMail訪問Gmail,下載任何新郵件&將它們添加到消息隊列(延遲作業),這個腳本將被一個cron作業每分鐘調用一次。

這個解決方案只是沒有「氣味正確」&我會關心它的擴展能力;每次運行cron /腳本時,我都不想加載整個Rails堆棧。

有沒有人有接收郵件的經驗&在Rails中的附件處理?

+0

* [...]從我的info @ mydomain轉發。com郵件帳戶到GMail收件箱,然後有一個Rails lib腳本使用MMS2R和TMail訪問GMail [...]。*爲什麼這是必要的?現在還有其他解決方案,爲什麼不直接從您的mydomain郵箱下載電子郵件? – Behrang

+0

如果您擔心每次我建議您查看[link](https://github.com/bvandenbos/resque-scheduler)時加載所有rails環境的cron作業。 – cicloon

+0

@Behrang - true我可以這樣做,更關心的是如何讓我的應用程序訪問我使用的任何郵件帳戶並有效地處理附件,不希望每分鐘或每次腳本運行時啓動一次rails實例。理想情況下,我希望將傳入的電子郵件/附件作爲POST請求發送給控制器....但由於附件大小較大,如果同時發送多個請求,這可能會很慢。 – Jason

回答

0

如果你主要關心的是每分鐘加載rails環境來運行腳本,我會建議mailgun以及一些cron替代品。

我使用bluepill + clockwork + delayed_job的組合來處理這個問題。我有自定義的工作,打which就像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} 
0

我寫了關於blog post若干在Rails中接收電子郵件的可能選項。 cron的方法很有效,但如果處理時間超過了你建議的5分鐘時間,然後再轉換到另一個時間點,而舊的問題還在繼續,那麼可能會出現一些問題。

這些替代方案着眼於如何將電子郵件直接發送到您的Web應用程序,以便您可以使用現有應用程序,而不必在每次運行cron任務時啓動另一個實例。這樣做顯然也有潛在的缺點,但像CloudMailin這樣的系統允許您將附件直接發送到S3以解決此問題。然後您可以使用後臺處理系統下載附件並調整它們的大小。

我也不得不modify paperclip有點讓它來調整附件的大小。

相關問題