私たちは毎日次の電子メールを受け取ります。[Eメール保護]添付ファイルの場合、ファイル名は次のとおりです。report.xlsx
受信した日付でファイルを保存する方法は?たとえば、20180131_report.xlsx
件名や送信者をどのようにフィルタリングしますか?
私のもの~/.procmailrc:
:0
*^content-Type:
{
:fw
| ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment
}
答え1
Procmail または受信 MTA が次のように構成されている場合From_
ワイヤーこの擬似ヘッダーには通常、メッセージ自体の前の日付がすでに含まれています。これを解析する必要がありますが、これは面倒であるため、これが実際にパフォーマンスを最適化する必要があるシステムでない限り(この場合は毎秒何百もの一致がありますか?)、最も簡単な解決策はを呼び出すことですdate +%Y%m%d
。
関連しない2つのヘッダーの1つを一致させるには、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:
条件も意味があるかどうかはわかりません。最近、ほとんどのメッセージにはとにかくフラグがあるでしょう)。
より複雑な条件を組み合わせるには、DeMorganの法則という論理の基本原理を使用できます。いいえ直接Procmailの構文は「この条件または低条件」を意味しますが、これをリファクタリングできます「((この条件ではない)および(低条件ではない))」ではありません.
: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
(具体的に)コマンドでパーセント記号を2倍にする方法に注意してくださいcron
。明らかに、上記の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:
ますが、多くの送信者は以前のバージョンとの互換性のために2つの場所に配置します。ファイル名は適切にRFC2231でエンコードする必要があります。これは、複数のオプションフィールドが埋められることを意味します。これは、ASCIIファイル名が村で唯一のゲームであったときと同じように空になると便利です。
また、送信者にどのようにリクエストするかをご覧ください。そして今一致するテーマです。HB ??
デフォルトのメッセージヘッダーまたは本文で一致するものを見つけるように(不正確に)表示されます。正確に言えば、後者の場合、一致はMIME本文部分のヘッダーになければなりませんが、Procmailではこれを指定する簡単な方法はありません。
答え2
各質問に対する回答:
レシピから外部コマンドを呼び出すことができるので、次のように変数を定義できます
TODAY
。TODAY=`date +%Y%m%d`
その後、レシピでこれを参照できます。
ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment/$TODAY_report_xlsx
ファイル名を動的に決定する必要がある場合は、それに応じてレシピを調整してください。
トピックのフィルタリングそして送信者として次のことができます。
:0 * ^content-Type: * ^From:.* [email protected] * ^Subject:.*Report { ....