毎秒cronjobを実行してPostfixメールボックス内の複数の電子メールを処理するのは良い方法と考えられていますか?

毎秒cronjobを実行してPostfixメールボックス内の複数の電子メールを処理するのは良い方法と考えられていますか?

私のPostfixメールボックスで受信される1時間あたり少なくとも3,000通の受信メールを処理する必要があります。処理には、電子メールの添付ファイルを抽出し、電子メールの添付ファイルの内容を外部の電子メールアドレスに送信することが含まれます。各メール添付ファイルについてメールを送信します。毎秒cronjobをスリープモードに切り替えるスクリプトを書くことでこれを達成することができるようですが、これが良い方法であるかどうかはわかりません(これにより、1時間あたり約3600個の電子メールを簡単に処理できます)。この問題を解決するための最良の方法を提案してください。電子メールをインポートして電子メールを送信するスクリプトはすでにあります。このスクリプトの唯一の問題は、一度に1つの電子メールしか処理できないことです。毎分cronjobを使用すると、1時間あたり60個のEメールしか処理できませんが、目標は実際には1時間あたり3000個以上のEメールです。

答え1

サーバーにトラフィックを維持できるCPUと帯域幅がある限り、Procmailはこの問題を簡単に解決できます。これを処理するスクリプトがすでに存在する場合は、各受信メッセージをスクリプトにリンクするだけです。次の項目を入力してください$HOME/.procmailrc

:0
| /path/to/your/script

スクリプトは、メッセージを標準入力として受け取り、そこからメッセージを転送または処理することを担当します。 (つまり、Procmailはこのメッセージを受信トレイにまったく転送しません。この動作を修正する方法については、以下を参照してください。)

(Procmailはこれに必須ではありませんが、スクリプトが可能なすべてのエラーケースを処理する必要がないように、素晴らしいセーフティネットを追加します。スクリプトが.forward十分に強力であれば、パイプをスクリプトに簡単に配置できます。これはツールを使用せずにPostfixの設定ファイルでこれを行うことを除いて、本質的に@number5の説明でもわかります.forward。)

スクリプトの2つのインスタンスを同時に実行できない場合(たとえば、バックエンドデータベースへの単独アクセスが必要なため)、ロックファイルを追加します。

:0:yourscript.lock
| /path/to/your/script

これにより、Procmailはファイルを見つけ、ファイルyourscript.lockが存在する場合は消えるまで待ってからファイルを作成し、レシピを実行してロックファイルを削除します。

ロックファイルを使用して転送を強制的にシリアル化します。ただし、これを行うとパフォーマンスが低下します。可能であれば、スクリプトを並列実行でより強力にすることをお勧めします。

一方、スクリプトがサーバーに過度の負荷をかけている場合は、複数の同時インスタンスを実行したくない場合があります。この場合、シリアライズされた配信を強制すると、パフォーマンスが実際に向上する可能性があります。

受信トレイにコピーをアーカイブするには、スクリプトに渡すときにコピーを複製します。

:0c # or :0c:yourscript.lock
| /path/to/your/script

特定の件名行を持つメッセージのみをスクリプトに関連付ける条件を追加することもできます。条件は、最初の文字としてアスタリスクを使用して指定され、その後にメッセージヘッダーと一致する必要がある正規表現が続きます。

:0
* ^Subject: xyzzy$
| /path/to/your/script

上記の方法が適切でない場合、次のレシピはすべての添付ファイルをディレクトリに抽出し、受信メッセージごとに電子メールを送信します。添付ファイルを繰り返すことは、おそらく上記のような外部スクリプトを使用するのが最善ですが、少なくともProcmail自体内でもう少し作業を行うことが何であるかについてのアイデアを提供する必要があります。

METAMAIL_TMPDIR=`mktemp -d /tmp/extracted.XXXXXXXXX`

# Crude attachment extraction ... how are you currently doing this?
:0c
| metamail -w -d

COUNT=`find "$METAMAIL_TMPDIR" -printf "%i\n" | wc -l`

:0
| ( echo Subject: $COUNT attachments extracted into $METAMAIL_TMPDIR; echo; echo ) \
  | sendmail -oi [email protected]

関連情報