Rails で電子メールを受信するためのベスト プラクティス
-
16-09-2019 - |
質問
私は、Rails アプリケーションで受信メールを処理する最適な方法を見つけようとしてきました。「ベスト プラクティス」が非常に主観的なものであることは承知しているため、最初に、私の主な関心事はスケーラビリティと効率であることを述べておきます。これが問題になるのは、主に、私の用途では大きな添付ファイルを処理する可能性があるためです。
ActionMailer を使用して電子メールを受信するという方法が受け入れられたのが昨日のことのようですが、最近、これは電子メールごとに新しい Rails インスタンスを生成するため非効率的である (大量の場合はひどい) という記事をいくつか目にしました。
最近、この記事が私の注目を集めました。http://jasonseifer.com/2009/04/24/receving-email-with-rails
この投稿では、Rails インスタンス全体の生成を強制されない、ActionMailer システムのスリム化バージョンについて説明していますが、コメントでは、専用のメール ディレクトリ (maildir?) や imap/pop 取得など、他のいくつかのオプションについて説明しています。
私の質問は次のとおりです。Rails アプリケーションで受信メール (添付ファイルを含む) を処理するための最善のオプションは何か、現時点で何か考えている人はいますか?
解決
私は維持します フェッチャープラグイン cron で使用する IMAP サーバーから電子メールをダウンロードする場合。以前はデーモンを使用していましたが、Ruby がハングするため (monit を使用した場合でも) 実行し続けるのは困難でした。Cron は私のワークロードには問題ありませんが、Rails プロセスを 1 分に 1 回生成します。
添付ファイルの処理については、 MMS2R 図書館。電子メールからファイルを取得するための優れたインターフェイスを備えています。
私が推奨したもう 1 つのアプローチは、受信したメッセージごとに HTTP ポストを発行することです。その後、それに対応するために Web 層を拡張できます。
恥知らずなプラグ: マイク・モンドラゴンと私の記事をチェックしてみてください。 Ruby での電子メール受信に関する PeepCode ブック.
他のヒント
は、HTTP経由でのRailsアプリへのPostfixからのメールを中継するために、私はちょうど私達がそれをやっている方法についての記事を書きました。
これは実際には非常に簡単ですが、我々はまた、中継することができない場合は、電子メールを延期するPostfixの能力を活用しています。私は、これまで他の場所でそれを見ていません。 http://www.doorkeeperhq.com/developer/smtp-to-web-を参照してください。詳細については、API でます。
はmms2r MMS2R#default_media
にそれが存在する場合、最大ビデオ取り付け、又はそのためにそれが存在する場合、最大画像添付、またはそれが存在する場合、最大のテキスト添付ファイルを返します。 MMS2R#default_text
は、それが存在する場合は、最大text / plainの添付ファイルを返します。また、例えば、mms2rのメディアハッシュを介して直接添付ファイルのいずれかにアクセスすることができますMMS2Rの#メディア。 MMS2R#media
は、MIMEタイプによってキー入力され、キーによって参照されるその値は、そのタイプのメディアの配列です。 2つのJPEGの添付がMMS2Rによって処理されたメールにあったのであれば、あなたは、例えば、画像/ JPEGとメディアのハッシュキーイングによって配列としてそれらにアクセスしますMMS2R#media['image/jpeg']
、それが見つかった添付ファイルはデコードされ、そのタイプの媒体のアレイに記憶されます。私が言ったように、その配列は、次いでMMS2R#media
ハッシュでMIMEタイプによってキー入力されます。
この本を購入、私はRubyのにして電子メールを受信したときに、私の住宅ローンの PeepCode本を払う必要がありますます。
私は最近、LMTP (EventMachine を使用しており、非常に高速で堅牢です) を使用して Postfix からメールを受信し、それを MongoDB に保存するデーモンを作成しました。その意味で、中間者 (IMAP サーバー + IMAP クライアント) が排除されます。このアプローチにより、ほぼ無制限のスケーラビリティと冗長性が得られます。他のバックエンドのサポート (MySQL、Redis など) は、ほとんどすぐに追加できます。