0

次のシーンがあります。

GNU/Linux マシンの SMTP サーバーはメールを受け入れています。受け入れられたメールは、さらに処理するために procmail に送信されています。これが私の.procmailrcです:

VERBOSE=yes
LOGFILE=$HOME/procmail.log
SUBJECT=`formail -xSubject: | tr -d '\n' | sed -e 's/^ //' | /usr/bin/perl -MEncode -ne 'print encode ("utf8",decode ("MIME-Header",$_ )) '`
FROM=`formail -rt -xTo:`
DATE=`formail -xDate:`
BODY=`formail -I ""`
:0fbW
* ^From.*some_special_name@special_server.com
| echo "FROM:$FROM" > $HOME/res.txt; \
  echo "DATE:$DATE" >> $HOME/res.txt; \
  echo "SUB:$SUBJECT" >> $HOME/res.txt; \
  echo "BODY:" >> $HOME/res.txt; \
  echo $BODY >> $HOME/res.txt; process.py

この小さなスクリプトは、最初にローカル ファイル$HOME/res.txtを作成し、次にprocess.pyという別のスクリプトを起動します。これで、$HOME/res.txtに次のエントリが入力されます。

FROM:some_special_name@special_server.com
DATE:Mon, 06 Oct 2014 13:14:32 +0200
SUB:Some subject
BODY:
This is a multi-part message in MIME format. --------------030006020609010705060803 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hello, Some kind of long tekst where I cannot see the line feed chars nor any other control chars...

本文には、本文の元の形式のない生の文字列が含まれています。これが意味するのは、\n または \t 文字が除外されるということです。process.pyスクリプトは、メール メッセージの元の形式を維持するために、メッセージの本文部分を要求します。

どうすればこれを達成できますか?

4

1 に答える 1

1

シェル スクリプトではいつものように、値に対してトークン分割とワイルドカード展開を実行するようにシェルに特に要求しない限り、変数を適切に二重引用符で囲む必要があります。詳細な説明については、たとえばこの回答を参照してください。

  echo "$BODY" >>$HOME/res.txt; \

さらに、そのような複数のアクションを混在させる理由がわかりません。行間で、標準入力の代わりにprocess.py読み取りを行うことを意味していると思います。res.txtもしそれが標準入力を読んでいるなら、それは正しい、混乱していないメッセージを受け取ります。

文脈がなければ、私は手足を出して、fフラグも間違っていると推測します。Procmailレシピファイルの残りの受信メッセージを置き換える新しいメッセージを標準出力に出力しない限りprocess.py、単にそれを取り出す必要があります。

ここには競合状態もあります: 複数のメッセージがほぼ同時に到着した場合 (システムの負荷が高い場合、「同時」はかなり広いウィンドウになる可能性があります)、それらは上書きさres.txtれ、互いの結果を踏みにじって予測不能になります。方法。これに対する通常の解決策は、ローカル ロック ファイルを使用することです。しかし、はるかに優れた解決策は、一時ファイルの必要性を取り除き、process.py代わりに標準入力を読み取るように変更することです。

とにかく Python を使用しているので、Python ですべてのヘッダー解析を行いformail -rtzxTo:ます。これにより、Procmail レシピが大幅に簡素化され、おそらく改善さprocess.pyれます (または、変更できない場合は、作成したラッパー)。

于 2014-10-07T09:56:00.687 に答える