Как обрабатывать входящие электронные письма с несколькими большими вложениями из приложения Rails? - PullRequest
3 голосов
/ 30 августа 2011

Мне нужно настроить приложение Ruby / Rails, которое может принимать входящие электронные письма, тело электронных писем будет игнорироваться, каждое электронное письмо будет иметь одно или несколько больших вложений (графических) размером до 20 МБ, приложение получит около10-20 таких писем в час.

Мне нужно использовать пользовательский адрес электронной почты / домен.

Быстрая обработка писем не является большим приоритетом, однако каждое письмо должно обрабатыватьсямаксимум через 5 минут после его поступления.

Я думал о том, чтобы все электронные письма автоматически переадресовывались с моей почтовой учетной записи info@mydomain.com на почтовый ящик GMail, затем я использовал сценарий Rails lib, используя MMS2R и доступ TMail GMail,загружать любые новые письма и добавлять их в очередь сообщений (отложенное задание), этот сценарий будет запускаться заданием cron раз в минуту.

Это решение просто "не пахнет правильно", и я бы беспокоился о его способности масштабироваться;Я не хочу загружать весь стек Rails каждый раз, когда запускается cron / скрипт.

У кого-нибудь есть опыт обработки входящей почты и вложений в Rails?

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

Я написал пост в блоге о ряде возможных вариантов получения электронной почты в Rails. Подход cron работает, но может возникнуть ряд проблем, если обработка займет больше времени, чем предложенные вами 5 минут, а затем вы раскручиваете другой экземпляр, пока старый все еще работает.

В альтернативах рассматривается, как вы можете отправить электронное письмо непосредственно в ваше веб-приложение, чтобы вы могли использовать существующее приложение, а не запускать другой экземпляр каждый раз при запуске задачи cron. Очевидно, у этого тоже есть потенциальные недостатки, но такие системы, как CloudMailin , позволяют вам отправлять вложения прямо на S3, чтобы обойти это. Затем вы можете просто использовать систему фоновой обработки, чтобы загрузить вложения и изменить их размер.

Мне также пришлось немного изменить скрепку , чтобы она изменила размеры вложений.

0 голосов
/ 30 августа 2011

Если ваша главная задача - каждую минуту загружать среду rails для запуска скрипта, я бы предложил mailgun вместе с некоторыми альтернативами cron.

Я использую комбинацию bluepill + часовой механизм + delayed_job , чтобы справиться с этим. У меня есть нестандартные задания, написание которых так же просто, как Delayed::Job.enqueue MyJob.new. Логика фиксируется в методе задания perform, который помогает минимизировать зависимости, если они есть.

часовой механизм используется для постановки в очередь отложенных заданий, загружая только минимальные зависимости, сохраняя минимальный объем памяти.

bluepill используется для отслеживания задержанных рабочих и часового процесса и запуска их резервных копий в случае сбоя или перезапуска в случае выхода из-под контроля.

Общее использование памяти: 20 МБ (bluepill) + 25 МБ (часовой механизм) + 80-90 МБ (задержанный рабочий)

Пример часового механизма.рб:

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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...