web-dev-qa-db-ja.com

複数のフォルダへの電子メールをフィルタリングするためのprocmailレシピ

現在、私のprocmailレシピは次のとおりです。

 FROM_=`formail -c -x"From "| awk '{ print $1 }'`

 SUBJ_=`formail -c -x"Subject:" | sed -e 's/^[ ]*//g' -e 's/[ ]*$//g'`

 :0
 *^Subject:.*(60)
 {
  :0 fwh
  | formail | (echo "$FROM_"; echo "$SUBJ_";)

  :0 fwb
  | formail -I ""

  :0
  myemail/
 }

私のprocmailレシピでは、件名に「60」が含まれるメールのみが除外されます。その後、formailは送信者の電子メールアドレスとその件名を取り出して実行し、その内容と一緒に「myemail」ディレクトリに転送します。

件名にコンマで区切られた複数の「60」がある場合、誰かが受信メールを異なるディレクトリにフィルタリングするためのprocmailレシピを作成するのを手伝ってもらえますか?

(たとえば、件名が6010,6011,6012、.. 6010の電子メールは6010フォルダーに入れられ、6011は6011に入れられます。)

件名の番号は電話番号です。さまざまな番号が多数存在する可能性があるため、一致する可能性のあるものをすべて列挙することは実際にはオプションではありません。

2
user119720

メールボックスがディレクトリの場合、1回の配信アクションですべてを一覧表示できます。その後、それはすべてと同じくらい簡単になります

:0
* ^Subject:.*60
`formail -zxSubject: | egrep -o 60[0-9]+ | sed 's%$%/%'`

バッククォートのスクリプトは、60123456789/(改行)609876543210/(改行)のようなものを出力します-電話番号と同じ数です。それぞれがフォルダ名として扱われ、メッセージはそれらすべてのフォルダに配信されます。

egrep | sedを単一のsedスクリプトにリファクタリングできると確信しています。Procmailが配信アクションをディレクトリ配信として扱うには、各フォルダ名の後にスラッシュを追加する必要があります。に配信することはできません。同時に複数のmboxフォルダ。)

私の元の答えは線の下に続きます。


あなたが質問していることは、Procmailで行うのはかなり難しいです。一連の一致をループする機能はありません。やや必死の回避策は、一致を変数に収集してから、変数の先頭から1つの値を処理する別のレシピファイルにINCLUDERC=し、値があるときに再びSWITCHRC=することです。変数に残されました。それほど複雑である必要はありませんが、Procmailが本当にその仕事に適したツールであるかどうかを尋ねなければならないほど、明らかにハックです。

もちろん、ブルートフォースオプションもあります。可能な60xxパターンをそれぞれ処理するレシピのシーケンスを作成します。

:0c
* ^Subject:.*6000
myinbox/6000/

6001、6002など。これは、これらの数が限られていることを前提としています。または、00から99までの各ケースを処理する必要がある場合は、単純なスクリプトを使用してレシピを生成します。

Perl -e 'printf ("%02i\n", $_) for 0..99' |
while read i; do
    cat <<____HERE
    :0c
    * ^Subject:.*60$i
    myinbox/$i/
____HERE
done >60xx.rc
1
tripleee