毎日、たとえばから電子メールを受け取ります。添付ファイル付きの[email protected]、ファイル名は例です。 report.xlsx
受信した日付でファイルを保存するにはどうすればよいですか?例えば20180131_report.xlsx
そして、どうすれば件名または送信者をフィルタリングできますか?
私の〜/ .procmailrc:
:0
*^content-Type:
{
:fw
| ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment
}
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にはこれを指定する簡単な方法がありません。
それぞれの質問に答える:
レシピ内から外部コマンドを呼び出すことができるので、次のようにして変数TODAY
を定義できます。
TODAY=`date +%Y%m%d`
その後、レシピでそれを参照できます。
ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment/$TODAY_report_xlsx
ファイル名を動的に決定する必要がある場合は、それに応じてレシピを調整します。
件名をフィルタリングするにはand送信者、次のようなことができます。
:0
* ^content-Type:
* ^From:.* [email protected]
* ^Subject:.*Report
{
....