1

procmailレシピを実行しているときに問題が発生しました。

ここで私がこれまでに得たもの:

  :0
     * ^X-Loop: myemail@gmail\.com
     /dev/null

     :0

    # filtering email by number 60
     * ^Subject:.*(60)
    {
      :0c:
      ${DEFAULT}

      #trying to take out input from the body
      :0fb
      | head -10

      #Forward it to the other folder
      :0
      mytest/
      }

この問題は、procmailが電子メールの本文を読み取るときに発生します。次のような出力が表示されます。

   +96szV6aBDlD/F7vuiK8fUYVknMQPfPmPNikB+fdYLvbwsv9duz6HQaDuwhGn6dh9w2U
   1sABcykpdyfWqWhLt5RzCqppYr5I4yCmB1CNOKwhlzI/w8Sx1QTzGT32G/ERTlbr91BM VmNQ==
   MIME-Version: 1.0
   Received: by 10.52.97.41 with SMTP id dx9mr14500007vdb.89.1337845760664; Thu,
   24 May 2012 00:49:20 -0700 (PDT)
   Received: by 10.52.34.75 with HTTP; Thu, 24 May 2012 00:49:20 -0700 (PDT)
   Date: Thu, 24 May 2012 15:49:20 +0800
   Message-ID: <CAE1Fe-r4Lid+YSgFTQdpsniE_wzeGjETWLLJJxat+HK94u1=AQ@mail.gmail.com>
   Subject: 60136379500
   From: my email <my email@gmail.com>
   To: your email <your email@gmail.com>
   Content-Type: multipart/alternative; boundary=20cf307f380654240604c0c37d07

   --20cf307f380654240604c0c37d07
   Content-Type: text/plain; charset=ISO-8859-1

   hi
   there
   how
   are
   you

   --20cf307f380654240604c0c37d07
   +96szV6aBDlD/F7vuiK8fUYVknMQPfPmPNikB+fdYLvbwsv9duz6HQaDuwhGn6dh9w2U
   1sABcykpdyfWqWhLt5RzCqppYr5I4yCmB1CNOKwhlzI/w8Sx1QTzGT32G/ERTlbr91BM VmNQ==

出力を取得できましたが、送信者が3行未満を送信すると、出力によって電子メールのフッターも印刷されるため、機能しません(ヘッド-10の範囲であるため)。

電子メールの本文のみをprocmailでフィルター(テキストファイルに出力)する必要があります。それは可能ですか?誰かが私に道を教えてもらえますか?私は私の知恵の終わりにいます。ありがとう

4

2 に答える 2

1

MIME マルチパートを単なるテキストの塊として扱おうとすると、危険が伴います。本文を適切に処理するには、MIME 対応ツールを使用する必要があります。ただし、最初の部分がテキスト部分であると仮定して、他の部分をすべて削除したい場合は、かなり単純で堅牢なものを作成できます。

# Truncate everything after first body part:
# Change second occurrence of --$MATCH to --$MATCH--
# and trim anything after it
:0fb
* ^Content-type: multipart/[a-z]+; boundary="\/[^"]+
| sed -e "1,/^--$MATCH$/b" -e "/^--$MATCH$/!b" -e 's//&--/' -eq

優雅さのポイントとして、10 行の本文の切り捨てアクションを同時に実装するスクリプトを開発できるかもしれませんが、少なくとも、これで作業を開始できるはずです。awk(この時点で または Perl に切り替えます。)

:0fb
* ^Content-type: multipart/[a-z]+; boundary="\/[^"]+
| awk -v "b=--$MATCH" ' \
    ($0 == b || $0 == b "--") && seen++ { printf "%s--\n", $0; exit } \
    !seen || p++ < 10'

適切に、MIME 部分のヘッダーは行数に数えるべきではありません。

これは少し推測です。「フッター」とは、本文の最初の部分の後に base64 でエンコードされた醜い添付ファイルを意味すると思います。もちろん、このレシピは、単一部分のメッセージに対しては何もしません。多分あなたはそれらの元のレシピに戻りたいと思うでしょう.

于 2012-05-25T19:56:19.117 に答える
0

最近同様の問題があり、これで解決しました(OPに適応)...

#trying to take out input from the body
:0fb
| sed -n '/^Content-Type/,/^--/ { /^Content-Type/b; /^--/b; p }'

説明: 一般的な形で....

sed -n '/begin/,/end/ { /begin/b; /end/b; p }'

-n:         --> turn printing off
/begin/     --> begin of pattern range (remainder commands only apply inside range)
,/end/      --> , end of sed pattern range
{ /begin/b; --> /b branch causes lines with pattern /begin/ to skip remaining commands
/end/b;     --> (same as above), these lines will skip the upcoming (p)rint command
p }'        --> prints lines that in pattern that made it to this command
于 2014-11-19T19:12:05.180 に答える