
Я думаю об архитектуре системы, которая должна обрабатывать входящую почту и передавать ее в приложение rails, которое обрабатывает входящую почту. Я не уверен, как лучше всего сделать что-то подобное.
Это должно работать так:
- Письма отправляются на адрес типа contact@user_id.myapp.com
- Почтовый сервер принимает письма и передает их в приложение Rails (или сохраняет их, а приложение Rails извлекает их)
- Приложение Rails обрабатывает почту (некоторые анализирует, а затем отправляет их в базу данных)
По сути, это должно работать как очередь. Внезапные пики почтового трафика не должны убивать приложение rails.
Я не ищу комплексного решения. Мне просто интересно ваше мнение. Я прикинул 3 возможных варианта:
- Rails подключается через Pop3 к почтовому серверу и просто загружает сообщения (вероятно, медленно)
- Почтовый сервер перенаправляет почту с помощью запроса POST в приложение rails (вероятно, это слишком медленно, может привести к краху веб-сервера при обнаружении почтовой бомбы)
- Maildir виртуально связан с файловой системой сервера приложений Rails (почтовый сервер и сервер приложений должны быть отдельными), и Rails просто читает данные напрямую из него.
Какой подход, по вашему мнению, является лучшим с точки зрения производительности и безопасности? Я что-то упускаю? Есть ли лучший способ? Знаете ли вы какие-то ресурсы с лучшими практиками?
Спасибо!
решение1
Вот пост, который может быть полезен:
Получение писем и вложений с помощью Rails
В статье также есть ссылки на предыдущие публикации по настройке RailsCron.
решение2
Я видел, как приложения делали это с POP3 (Spiceworks — один из примеров, который приходит мне на ум). Я думаю, что это достойный способ отделить сервер приложений от почтового сервера, и позволяет почтовому серверу сосредоточиться на том, что он делает хорошо, и освобождает клиента от обязанностей по очередям и хранению сообщений.
re: Безопасность
Проблема с POP3, которая приходит на ум, — это использование учетных данных в виде открытого текста по умолчанию. Если вы можете запустить его через SSL (зависит от почтового сервера), вы можете смягчить эту проблему.
re: Производительность и масштабирование
Я не уверен, что доступ по POP3 будет таким уж медленным. Я бы поостерегся делать интеграцию на уровне файловой системы, потому что у вас могут возникнуть проблемы с конкуренцией и блокировкой (фу, вспомните монтирование почтовых каталогов через NFS как пример забавных проблем с конкуренцией файловой системы) по мере поступления новой почты. POP3 предоставляет вам хороший метод атомарного доступа к элементам в почтовом ящике.
Наличие нескольких потребителей, работающих на одном почтовом ящике POP3 одновременно, вероятно, будет проблематичным (если вы пытаетесь масштабироваться для обработки большего трафика сообщений). Для этого вам может понадобиться написать скрипт на стороне почтового сервера для циклического распределения входящих сообщений в группу почтовых ящиков и привязать каждого потребителя к определенному почтовому ящику. (Вы можете рассмотреть возможность использования IMAP для архитектуры с несколькими потребителями, но это просто мои пустые слова без продумывания.)
Вы добавляете больше слоев и потенциальных узких мест, конечно, чем просто принимаете SMTP напрямую в свой код, но вы используете всю работу, которую уже проделали авторы почтового сервера. Я бы предпочел иметь проблему масштабирования на почтовом сервере, чем проблему масштабирования в пользовательском коде SMTP-сервера.
решение3
Rails, вероятно, неподходящий инструмент для этой работы. Вероятно, вы захотите написать небольшой скрипт, который принимает электронную почту на stdin и вставляет ее в вашу базу данных. Вы можете использовать тот же код ActiveRecord, чтобы сделать это. Затем вам просто нужно настроить MTA для доставки почты, передав ее в ваш скрипт.
Если вам нужно немного больше производительности, вы можете переписать свой скрипт так, чтобы он стал демоном, принимающим электронную почту через LTMP, что избавит от неэффективности запуска процесса для каждого письма.
решение4
Вместо POP (если вы идете этим путем) используйте IMAP(S). Таким образом, вы можете оставить вещи на сервере "прочитанными" после того, как они были обработаны.