[PREVIOUS CHAPTER]
[NEXT CHAPTER]
4 フィルタリング機構の内部構造
4.1 配送メールへのフィルタリング
$USE_DISTRIBUTE_FILTER
をセットすると、配送処理に入る直前(&Distribute ルーチンの先頭)で
%Envelope のデータ群(ヘッダやメール本文)に対してフィルタリング操作をか
けます。そして問題のある内容のメールの配送をしないなどができるようにな
ります。
$USE_DISTRIBUTE_FILTER
をセットしただけのデフォールトでは(現在(97/12/14))次のようなメールは
reject します。
○ 本文が何もないメール
○ help や unsubscribe などの英語一行メール
○ %echo ふがほげ の行
1999/02/24からはこの行がひっかかった時点で拒否
これ以前はあるパラグラフがこの行そのものの時のみ拒否
つまり『空行+%echoなんとか行+空行』の時だけだった
○ Message-Id: が朗かに addr-spec でないのは SPAM メール
[options]
$FILTER_ATTR_REJECT_COMMAND (default 0)
○ #unsubscribe などのコマンドをはじく
$FILTER_ATTR_REJECT_2BYTES_COMMAND (default 0)
○ 2バイト英文字ではじまる行を拒否
例: UNSUBSCRIBE ほえほえ
これ以外の高度なチェックは
$DISTRIBUTE_FILTER_HOOK (for post)
$COMMAND_FILTER_HOOK (for command)
で直接 perl の構文で %e (%Envelope) ハッシュの変数を使って記述して下さ
い。HOOK 内部では $e{'h:from:'} などでハッシュにアクセスして下さい。
#このために独自の言語とかをまた新たに導入するのは面倒だとおもうので
#perl で生書きです。
この HOOK では次のようなことを期待しています。
reject する場合は reject の理由を含む文を return する
そうでないなら 何も返さない (return ''; など)
この reject の理由はログに残されます。また、
$FILTER_NOTIFY_REJECTION
という変数が設定されていれば、その理由をそのメールの送り主に送り返しま
す。デフォールトでは単に無視するだけです。
4.2 signature かどうか?を判定する
fml-support: 08182
if ( メール本文が 1 paragraph のみ ) {
ちぇっくしてみる (signature なしかな)
}
elsif ( メール本文が 2 paragraphs ) {
最後のパラグラフをちぇっくしてみる (本文 と signature かな?)
if ( 引用ぽいかな? ) {
}
elsif ( 最後のパラグラフは
@ とか :// とか TEL: とか FAX: とかを含んでいる?
account@domain なんかもためしてみよう? ) {
}
}
4.3 特定のフィールドの内容によっては拒否する
4.4 警告するだけにする
弾くのではなく、警告を与えるだけで投稿は許して良いという意味なんでしょ
うか?
フィルタリング機構はそういうためのものではありません。
弾くために作られています。
なので、むりくり HOOK を使うと(たぶん)できるようなきがします。
$START_HOOK = q#
if ($USE_DISTRIBUTE_FILTER) {
&EnvelopeFilter(*e, 'distribute');
undef $DO_NOTHING;
}
#;
説明: EnvelopeFilter() の結果だけは利用するけど:-)
$DO_NOTHING をリセットしてしまえばひっかかってもひかからなくても
この後普通のMLプロセスになるから
[PREVIOUS CHAPTER]
[NEXT CHAPTER]