[PREVIOUS CHAPTER]
 [NEXT CHAPTER]
2	投稿メールのフィルタリング事例
2.1	Message-Id: がないものを reject
	&DEFINE_FIELD_PAT_TO_REJECT('message-id', '^\s*$');
2.2	Subject:に特定のパターンがあったら拒否する
Subject: に FREE SEX ADULT XXX のいづれかの文字列が入っていたら
	SPAMとみなして捨てる(でもこれするとFreesoftも捨てちゃうね;-)
	最初と最後の / はあってもなくてもよいです。/ 以外は使わないで下さい
	&DEFINE_FIELD_PAT_TO_REJECT('subject', 'FREE|SEX|ADULT|XXX');
	&DEFINE_FIELD_PAT_TO_REJECT('from', 'ADULT');
or
	&DEFINE_FIELD_PAT_TO_REJECT('subject', '/FREE|SEX|ADULT|XXX/');
	&DEFINE_FIELD_PAT_TO_REJECT('from', 'ADULT');
2.3	Subject:に特定のパターン(大文字小文字を問わず)があったら拒否する
	Adult も ADULT も大文字小文字に関係なく許否。/i というperlで
	おなじみの形式を使います。/ 以外は使わないで下さい。
	&DEFINE_FIELD_PAT_TO_REJECT('subject', '/free|sex|adult|xxx/i');
2.4	received: 行のどこかに spam.co.jp というドメインを含んでいたら拒否
$DISTRIBUTE_FILTER_HOOK = q#
    if ($e{'h:received:'} =~ /from spam.co.jp/) {
	return 'from a host in spam blacklist';
    }
#;
2.5	本文にhttp-equiv=3DContent-Type なHTMLをつけてくる迷惑なメールは拒否
$DISTRIBUTE_FILTER_HOOK = q#
    if ($e{'Body'} =~ /http-equiv=3DContent-Type/) {
	return 'mail with appended HTML documents';
    }
#;
2.6	From: のドメインが Message-ID に含まれていないなら拒否
$DISTRIBUTE_FILTER_HOOK = q#
   local($domain) = (split(/@/, $From_address))[1];
   if ($e{'h:message-id:'} !~ /$domain/i) {
	return 'Message-Id conflicts your From: address';
   }
#;
2.7	前者3つ全部
例: (not tested ;-)
○ received: 行のどこかに spam.co.jp というドメインを見つけたら拒否する。
○ 本文に http-equiv=3DContent-Type なHTMLをつけてくる迷惑なメール
   は reject する
○ From: のドメインが Message-ID にも含まれているかどうか?
   含まれていないならメールの偽造とみなして reject
$DISTRIBUTE_FILTER_HOOK = q#
    if ($e{'h:received:'} =~ /from spam.co.jp/) {
	return 'from a host in spam blacklist';
    }
    if ($e{'Body'} =~ /http-equiv=3DContent-Type/) {
	return 'mail with appended HTML documents';
    }
   local($domain) = (split(/@/, $From_address))[1];
   if ($e{'h:message-id:'} !~ /$domain/i) {
	return 'Message-Id conflicts your From: address';
   }
#;
2.8	sendmail の PICKY_HELO_CHECK と組み合わせる
    # PICKY_HELO_CHECK
    if ($e{'h:x-authentication-warning:'} !~ /Host \S+ claimed to be \S+/) {
	$r = "Your SMTP session or your host config is invalid";
    }
でもメールを出す人が virtual domain とかだとバソバソ reject されて困っ
ちゃうだろう #それでも構わないという人は使ってみよう(強引)
2.9	ヘッダ情報の容量制限の設定ってのはあるんでしょうか?
いまのサイズ制限はヘッダと本文と全部含んだ長さについてです。
ヘッダの長さだけをチェックするというオプションは今はないです。
ヘッダが十分大きくてひっかかる場合はどうせ今のチェックと同じだし、
ヘッダは普通で本文がでかい場合には、どうせヘッダの大きさは誤差でしょう
という感じです。#そのあいだの微妙な場合はかんがえてないといえばない
2.10	To: とか Cc: にメーリングリストがないのはSPAMだ!
fml-support: 06389
fml-support: 07286
SPAM メールを弾くために
To: および Cc: 行に ML のアドレス (大文字/小文字は区別しない) が入って
なければ,そのメールを拒否する
$USE_DISTRIBUTE_FILTER = 1;
$DISTRIBUTE_FILTER_HOOK = q#
    if (($e{'h:to:'} !~ /$MAIL_LIST/i) && ($e{'h:cc:'} !~ /$MAIL_LIST/i)){
        return 'Not addressed to mailing list';
    }
#;
2.11	EnvelopeFilterは厳し過ぎる。VBscriptだけ弾きたい
1. Content-Type: に .vbs .js .jse .exe とあるメール
2. 元のメールは badarticle というファイルに保存して 
3. MLにはアナウンスを流す。
   「ウィルスぽいものが来たので、MLに流さずに別途ファイルに落した」 
# check attatchment of VB script and others :-)
$START_HOOK .= q#
    if ($Envelope{'Body'} =~ /Content.*\.(vbs|js|jse|exe)/i ||
	$Envelope{'Body'} =~ /filename=.*\.Pretty Park\.exe/i ) {
	my($savefile) = "$FP_TMP_DIR/badarticle.$PCurrentTime";
	if (open(SAVE, "> $savefile")) {
	    print SAVE $Envelope{'Header'};
	    print SAVE "\n";
	    print SAVE $Envelope{'Body'};
	    close(SAVE);
	    $Envelope{'Body'}  = 'WARNING: incoming mail is ignored ';
	    $Envelope{'Body'} .= 'since it may be with virus.';
	    $Envelope{'Body'} .= "\n\n";
	    $Envelope{'Body'} .= "This article is saved in\n";
	    $Envelope{'Body'} .= $savefile;
	    $Envelope{'Body'} .= "\n\n";
	    $Envelope{'Body'} .= "-- $MAIL_LIST maintainer\n";
	}
	else {
	    &Log("system error: pass this article through");
	}
    }
#;
2.12	Notes で「Duplicated Message-ID」になるケース
Q: Notesのメールでテンプレートか何かを使うと同じMessage-IDになるのため
  「Duplicated Message-ID」になるケースはどうする?
これは直しようがないです;-) NOTES担当に文句をいいましょう 
2.13	特定のアドレスを拒否する(e.g. spam mails)
2.14	勝手についてしまう signature を取る
(料金を下げるかわりにそういうことをするとか最初に明言しているサービス
ならともかく)そもそもメールの本文をいじるなんてとんでもない話ですね
これができるということは内容の改竄もできるし機密保持も存在していないわ
けです。ということは通信の秘密に関してモラルがない企業ということではな
いでしょうか?
その部分を削るHOOKの例:
$SMTP_OPEN_HOOK = q#
	local($uja);
	for (split(/\n/, $e{'Body'})) {
	   next if /=+/ .. /\-+/;
	   $uja .= "$_\n";
	}
	$e{'Body'} = $uja;
#;
[PREVIOUS CHAPTER]
 [NEXT CHAPTER]