[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)

    	○ ２バイト英文字ではじまる行を拒否
    	   例: ＵＮＳＵＢＳＣＲＩＢＥ ほえほえ

    これ以外の高度なチェックは

    	$DISTRIBUTE_FILTER_HOOK (for post)
    ＃ $REJECT_DISTRIBUTE_FILTER_HOOK でも可能です(obsolete)。
    ＃ 同様に $REJECT_COMMAND_FILTER_HOOK もありますが obsolete

    	$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	特定のフィールドの内容によっては拒否する

    	&DEFINE_FIELD_PAT_TO_REJECT(ヘッダフィールド, 正規表現, REASON)

    という関数は EnvelopeFilter 中で使われる %REJECT_HDR_FIELD_REGEXP とい
    うハッシュの内容を設定できます。これはあるフィールド(例えば Subject:)
    の特定の内容について reject します。Case Sensitive です。ADULT と書く
    と adult にマッチしません。
    XXX "reason"はまだ実装されていません。

    4.4	警告するだけにする

    弾くのではなく、警告を与えるだけで投稿は許して良いという意味なんでしょ
    うか？

    フィルタリング機構はそういうためのものではありません。
    弾くために作られています。
    なので、むりくり HOOK を使うと(たぶん)できるようなきがします。

    $START_HOOK = q#
       if ($USE_DISTRIBUTE_FILTER) {
            &EnvelopeFilter(*e, 'distribute');
            undef $DO_NOTHING;
        }
    #;

    説明: EnvelopeFilter() の結果だけは利用するけど:-)
          $DO_NOTHING をリセットしてしまえばひっかかってもひかからなくても
          この後普通のＭＬプロセスになるから

[PREVIOUS CHAPTER] [NEXT CHAPTER]