以下を含むスパムをブロックするために exim フィルタを作成しようとしています。
「85%割引」
タイトル行に。スペース、2桁の数字、パーセント記号、スペース、およびすべて大文字の「OFF」という単語です。これが私が書いたものです:
# Exim filter
if
$header_subject: contains " \\d{2}% OFF"
then
fail text "no spam please"
seen finish
endif
ところがこれはできないようで、マッチしたメッセージが渡されてもパススルーが許可されるようです。正規表現 101テスト。私は何を見逃していますか?正しい構文は何ですか?
答え1
一時的に私をあなたのもの.forward
と交換しましたが、うまくいかないことを確認しました。
2つの質問があります。
contains
部分文字列のマッチングを行いますが、正規表現を理解していません。matches
代わりに、必要な正規表現を使用してくださいcontains
。PCREスタイルの文字クラスは、構文のように
\d
破損しているようです!{N}
色々な組み合わせを試してみました。唯一の有効な構文は機能しなくても機能[0-9][0-9]
しません。 (私はバージョン4.72を実行しています。)[0-9]{2}
[0-9]\\{2\\}
\\d\\d
編集:理由は次のとおりです。 正規表現にスペースが含まれていない場合は、Eximフィルタファイルの正規表現を引用符で囲む必要はありません。しかし、引用符のない正規表現でもバックスラッシュは2倍になるはずです。引用された正規表現では、再度倍増する必要があります。$header_subject: matches "\\\\d{2}% OFF"
.count `em:バックスラッシュ4つ。
スクリプトテストを使用してください/usr/sbin/exim -bF <scriptfile> -f <sender>
。テストメッセージは、標準入力(ファイルからリダイレクト)として提供する必要があります。
テストSubject:
処理の場合、対応するヘッダー行のみを含め、他のものを含めることはできません。F
の大文字はコマンド処理を-bF
有効にするために使用され、使用すると無効になります。fail
-bf