web-dev-qa-db-ja.com

procmailは、ファイル名に受信日を含む添付ファイルを保存します

毎日、たとえばから電子メールを受け取ります。添付ファイル付きの[email protected]、ファイル名は例です。 report.xlsx

受信した日付でファイルを保存するにはどうすればよいですか?例えば20180131_report.xlsxそして、どうすれば件名または送信者をフィルタリングできますか?

私の〜/ .procmailrc

:0
*^content-Type:
{
    :fw
    | ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment
}
2
FaxMax

Procmailまたは受信MTAが、適切なメッセージの前に From_ line を挿入するように構成されている場合、この疑似ヘッダーには通常、すでに日付が含まれています。解析する必要がありますが、これはドラッグです。したがって、これがパフォーマンスを最適化する必要があるシステムでない限り(この条件では、1秒あたり数百の一致?)、絶対に簡単な解決策はdate +%Y%m%dを呼び出すことです。 。

2つの無関係なヘッダーのいずれかと一致させるには、両方を|の正規表現に配置します。

:0
* ^Content-type:
* ^From:(.*\<)?foo@example\.tld|^Subject: Your daily report
| ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment/$(date +%Y%m%d)_report.xslx

(ここにバグがあります。以下の更新を参照してください。)

fwフラグはこのコンテキストでは意味がないので、それらを削除しました(実際、Content-type:条件も意味があるかどうかはわかりません。ほとんどのメッセージには、とにかくそれがあります。最近)。

組み合わせたいより複雑な条件がある場合は、ド・モルガンの法則と呼ばれる論理からの基本原理を使用できます。 Procmailには「この条件またはその条件」と言うdirect構文はありませんが、 これをリファクタリングできます から「not((この条件ではない)」および(その条件ではありません))。」

:0
* ! this condition
* ! that condition
{ } # nothing happens here
:0E # else
{ LOG="at least one of them matched
" }

または、単にスコアリングを使用します。

:0
* 1^0 this condition
* 1^0 that conditon
{ LOG="at least one of them matched
" }

更新:

ripmime は、実際には個々の添付ファイルの命名(抽出または)をサポートしていないようです。最も簡単な解決策は、おそらくcronジョブで、最新の到着の名前を深夜の少し前に変更します(または、到着時刻がわかっている場合は、予想される最新の時刻の少し後に)。

 55 23 * * * cd /dir/to/save/attachment && mv report.xslx "$(date +%%Y%%m%%d)"_report.xslx

cronコマンドでパーセント記号を2倍にする必要があることに注意してください(特に)。上記のProcmailレシピを元に戻して、ripmime/dir/to/save/attachmentに保存するだけです。

または、添付ファイルが到着したらすぐに名前を変更しますが、条件をかなり厳しくします。以下には、添付ファイルを配信するメッセージがどのように正確にエンコードされるかについてのかなりの推測が含まれています-さまざまなコンテンツタイプ、MIME構造、MIMEヘッダーから選択できます慣例などなので、調整しないと機能しない可能性があります。

:0
* ^From:(.*\<)?foo@example\.tld
* ^Subject: Your daily report
* HB ?? ^Content-type: application/(octet-stream|vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet|vnd\.ms-here-be-dragons-xslx); filename="?report.xslx
| ( cd dir/to/save/attachment; \
    ripmime --overwrite --no-nameless -i - -d . && \
    mv report.xslx $(date +%Y%m%d)"_report.xslx )

Content-type:ヘッダーにファイル名が含まれていない可能性があります。 Content-Disposition:で指定できます(最近はそうする必要があります)が、下位互換性のために多くの送信者が両方の場所に配置しています。ファイル名はRFC2231で適切にエンコードされている必要があります。つまり、ASCIIファイル名が町で唯一のゲームだったときのように、空になると便利に想定した場所に、いくつかのオプションのフィールドを入力できます。

送信者件名を一致させる必要があることにも注意してください。 HB ??は、メインメッセージヘッダーまたは本文のどこかで一致するものを探すように(不正確に)言います。正しく言えば、後者の場合、一致はMIME本文部分のヘッダーにあるはずですが、Procmailにはこれを指定する簡単な方法がありません。

7
tripleee

それぞれの質問に答える:

  1. レシピ内から外部コマンドを呼び出すことができるので、次のようにして変数TODAYを定義できます。

    TODAY=`date +%Y%m%d`
    

    その後、レシピでそれを参照できます。

    ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment/$TODAY_report_xlsx
    

    ファイル名を動的に決定する必要がある場合は、それに応じてレシピを調整します。

  2. 件名をフィルタリングするにはand送信者、次のようなことができます。

    :0
    * ^content-Type:
    * ^From:.* [email protected]
    * ^Subject:.*Report
    {
    ....
    
3
mjturner