当初、regex map を用いて MIME 展開前のパターンを設定するという戦略で作業を開始しました。 あれこれ思考錯誤した末に、いくつかの MIME なパターンを加えて、
のようにしてみました。 (TEXT 版)
LOCAL_CONFIG Kadsign regex -a@MATCH -f (B\!\*9-9p\!\*|^=\?[Ii][Ss][Oo]-2022-[Jj][Pp]\?B\?(GyRCISo5LTlwIS|IRskQjktOXAbKEIh|GyRCISobKEI=\?=\.=\?[Ii][Ss][Oo]-2022-[Jj][Pp]\?B\?GyRCOS05cBsoQg==\?=\.=\?[Ii][Ss][Oo]-2022-[Jj][Pp]\?B\?GyRCISobKEI=\?=)) LOCAL_RULESETS HSubject: $>CheckSubject SCheckSubject R$* $: $(adsign $1 $) R@MATCH $#discard $: discard
しかし、上記ではまだまだ不十分で、 MIME な組み合わせは valid なのだけを考えても膨大になるので、 結局、ちょっと重くなってしまいますが、 Perl で MIME をデコードしてからマッチングをおこなうスクリプトを書いて、 program map を使って呼び出すようにしました。 .mc は以下のようになります。 (TEXT 版)
呼び出される Perl スクリプトは以下のようになります。 (TEXT 版)
LOCAL_CONFIG Kadsign program /usr/local/libexec/adfilter LOCAL_RULESETS HSubject: $>CheckSubject SCheckSubject R$* $: $(adsign $1 $) R@MATCH $#discard $: discard
adfilter を /usr/local/libexec/adfilter にインストールし、使用してください。 この Perl スクリプトには日本語が含まれます。 EUC で保存して使用する必要がありますので注意してください。
#!/usr/bin/perl use Jcode; use strict; my $str = $ARGV[0]; my $s = $str; $s =~ s/(=\?=)\.(=\?ISO-2022-JP\?B\?)/$1 $2/igo; my $jconv = new Jcode($s); $str = '@MATCH' if ( $jconv->mime_decode =~ /^(!|!)広告(!|!)/o ); print "$str"; exit 0;
先の例に適宜パターンを追加していくか、ちょっと重くても我慢するか、
好みに応じて使い分けると良いかもしれません。
また、このフィルタはまだまだ不完全だと思いますので、
それなりのものだと理解の上ご使用ください。
そもそも、所詮「人間が」見て確認するための方法を提示しただけで、
機械的に処理するにはあまりに曖昧な規則です。
それに、広告メールには「!広告!」という記述があると決めただけであり、
「!広告!」と記述されたメールは広告メールであると
定義されたわけでは決してありません。
おそらく、今後、抜け道を突いた記述が出てくるものと予想されます。
「!」、「広」、「告」、「!」の間に空白があっても SPAM と見倣すべきではないかという意見を頂きました。 空白があっても discard したい方は、パターンを
/^\s*(!|!)\s*広\s*告\s*(!|!)/oに変えると良いかもしれません。
なお、このようなフィルタを使用する際、 決して reject するようにしてはいけません。 SPAM は From: あるいは envelope from を偽称しているケースが多いので、 エラーメールが発信元に返るなんてことは期待できませんので。