%%Title: spamassassin 様にすがってみる

%%Created: Fri Nov  1 14:46:43 JST 2002
%%Updated: Fri Nov 29 12:05:54 JST 2002

o spamassassin って何?

	perlで書かれたspamフィルタ
	http://www.spamassassin.org/
	FreeBSDでは p5-Mail-SpamAssassin として ports化されている

	ライブラリは /usr/local/lib/perl5/site_perl/5.005/Mail/SpamAssassin/ にインストールされてる
	ルールの初期値は /usr/local/share/spamassassin にある。

	spamassassin(1) 
		spam判定プログラム
	spamd(1), spamc(1)
		spam判定エンジンをデーモン化して時間短縮する

	POPしてきたメールを spamassassinや spamcにくわせてもよいが、
	MTAで spamd を動かして sendmail.cf等から spamcを叩くとスプールさせる
	前にspamを取り除くことができる。

	2.31の時点では

	  # TODO: doesn't yet handle checking multiple-attachment messages,
	  # where one part is qp and another is b64.  Instead the qp will
	  # be simply stripped.

	なので、multipartされているとお手上げ。

o テスト
	spamと思うメールを spamassassin に食わせてみる。
	
	% spamassassin < hoge
	Return-Path: 
		:
	    (メールヘッダ)
		:
	X-Spam-Status: Yes, hits=6.6 required=5.0
		tests=BASE64_ENC_TEXT,DATE_IN_FUTURE_12_24,RCVD_IN_DSBL,
		      SPAM_PHRASE_00_01,USER_AGENT_OE
		version=2.43
	X-Spam-Flag: YES
	X-Spam-Level: ******
	X-Spam-Checker-Version: SpamAssassin 2.43 (1.115.2.20-2002-10-15-exp)
	X-Spam-Prev-Content-Type: multipart/alternative; boundary="----=_NextPart_000_0463_CCF41935.2C68805A"

	SPAM: -------------------- Start SpamAssassin results ----------------------
	SPAM: This mail is probably spam.  The original message has been altered
	SPAM: so you can recognise or block similar unwanted mail in future.
	SPAM: See http://spamassassin.org/tag/ for more details.
	SPAM: 
	SPAM: Content analysis details:   (6.60 hits, 5 required)
	SPAM: USER_AGENT_OE      (0.2 points)  X-Mailer header indicates a non-spam MUA (Outlook Express)
	SPAM: SPAM_PHRASE_00_01  (0.8 points)  BODY: Spam phrases score is 00 to 01 (low)
	SPAM: BASE64_ENC_TEXT    (1.4 points)  RAW: Message text disguised using base-64 encoding
	SPAM: DATE_IN_FUTURE_12_24 (1.0 points)  Date: is 12 to 24 hours after Received: date
	SPAM: RCVD_IN_DSBL       (3.2 points)  RBL: Received via a relay in list.dsbl.org
	SPAM:                    [RBL check: found 81.160.98.24.list.dsbl.org]
	SPAM: 
	SPAM: -------------------- End of SpamAssassin results ---------------------
		:
	    (元のメールボディ)
		:
	

	判定結果がメールヘッダとメールボディに付け加えられる。
		メールヘッダはプレフィクス X-Spam-
		メールボディはプレフィクス SPAM:
	初期設定では 5点で spamメールと判断するので、
	上記の例では 6.60点なので spamメールと判定されている。

	日本語のメールはルールの書き方にもよるけど
	% nkf -e -m0 < hoge | (setenv LANG ja_JP.EUC ; spamassassin)

o チューニング

	設定ファイル
		spamassassin(1)を使う場合
			$HOME/.spamassassin/user_prefs で調整
			spamassassin は起動するとこのファイルを読んで初期値を上書きする。
		spamd(1)を使う場合
			/usr/local/share/spamassassin/15_site.cf とかに書く。
			個人で使うには user_prefs にリンクしてもいい。
			# ln -s $HOME/.spamassassin/user_prefs /usr/local/share/spamassassin/15_site.cf

		user_prefs のサンプル

	blacklist_from
	whitelist_from
		特定の From: を受信/拒否する

		whitelist_from Internet-Drafts@ietf.org
		blacklist_from big@boss.com

	DATE_IN_FUTURE_12_24
		配送経路の時間設定に問題があると引っかかるので下げる
		初期値は 3.308
		score DATE_IN_FUTURE_12_24 1.0

	UNDISC_RECIPS
		To: が undisclosed-recipients だと引っかかる
		初期値は 4.034
		score UNDISC_RECIPS 1.0

	FROM_AND_TO_SAME_5
		From: と To: が同じで 1.3 は低いと思う…とりあえず3倍。
		初期値は 1.3
		score FROM_AND_TO_SAME_5 3.9

	DEAR_SOMEBODY
	DEAR_FRIEND
		Dear hoge を使う人とはつきあいがないので上げる
		初期値は -0.694
		score DEAR_SOMEBODY 1.5
		score DEAR_FRIEND 1.5

	ORDER_STATUS
		初期値は -3.0
		negative check で点数引いてるのはなんで??
		score ORDER_STATUS 3.0

	CASHCASHCASH
		JISだと $ 沢山使ってるので EUCに変換してからチェックする
		nkf -e -m0 < hoge | spamassasin -t
			※ nkfのデフォルト動作は MIMEデコードする。SubjectもEUCに変換されちゃうと SUBJ_FULL_OF_8BITS にひっかかるので -m0 を使う
		それでも引っかかる… spamassasinは bodyのチェックといいつつ実はSubject:もチェックの対称にしている
		しかも、内部で MIMEデコードしているので本文とコードセットがことなったまま渡る。
		例えば
			Subject: =?ISO-2022-JP?B?MTEbJEI3bjgmNWYycSRHRDokJCQ/MFU4KxsoQg==?=
		は、nkf -e -m0 の結果、本文がEUCでも 
			Subject: 11.$B7n8&5f2q$GD:$$$?0U8+.(B.
		で渡るので、$$$にひっかかる

		面倒なので無視する。

		score CASHCASHCASH 0

	SUBJ_HAS_Q_MARK
		比較する時に Subject:は上記の様に変換されているので ? に引っかかる
		これも面倒なので値をさげる
		初期値は 0.7
		score SUBJ_HAS_Q_MARK 0.3

	UPPERCASE_25_50
	UPPERCASE_50_75
	UPPERCASE_75_100
		JISだと $ 沢山使ってるので EUCに変換してからチェックする
		nkf -e -m0 < hoge | spamassasin -t
		それでも引っかかる…
		EvalTests.pm では [A-Z]と[a-z]の存在比率を見てる
		多分、EUC限定で [A-Z]と[a-z\x80-\xff]にしないとダメ
		とりあえず SpamAssassin-2.43 に対するパッチ
		
		*** EvalTests.pm.orig	Fri Nov 15 02:05:47 2002
		--- EvalTests.pm	Fri Dec 13 08:45:02 2002
		***************
		*** 1639,1641 ****
		    # count numerals as lower case, otherwise 'date|mail' is spam
		!   my $lower = $body =~ tr/a-z0-9//d;
		    my $upper = $body =~ tr/A-Z//;
		--- 1639,1641 ----
		    # count numerals as lower case, otherwise 'date|mail' is spam
		!   my $lower = $body =~ tr/a-z0-9\x80-\xff//d;
		    my $upper = $body =~ tr/A-Z//;
		

	CHARSET_FARAWAY_HEADERS
	CHARSET_FARAWAY
		LC_ALL,LANGUAGE,LC_MESSAGES,LANG のいずれかに ja_JP.EUC を設定しておく
		優先順はこの順。
		コードを見ると…
		spamd/spamc
			spamdにlocaleを設定する
			export LANG=ja_JP.EUC /usr/local/bin/spamd -d

		spamassassin
			export LANG=ja_JP.EUC /usr/local/bin/spamassassin -t < hoge

	FROM_STARTS_WITH_NUMS
	NO_REAL_NAME
	FROM_ENDS_IN_NUMS
		携帯からのメールだとこれらに引っかかる。
		From: のドメインを whilelist_from に追加する

		whilelist_from *@docomo.ne.jp
		whilelist_from *@jp-h.ne.jp

	HTTP_CTRL_CHARS_HOST
		Subject: [ipv6:0034] のように、メーリングリスト名とメールの
		整理番号の区切りに":"を使っていると引っかかる。
		PerMsgStatus.pmの $base_uri の初期値が問題あり? 
		Subject: と本文の扱いは分けたい所。
		とりあえず SpamAssassin-2.43 に対するパッチ
		
		*** PerMsgStatus.pm.orig	Fri Dec 13 08:40:51 2002
		--- PerMsgStatus.pm	Fri Dec 13 08:41:33 2002
		***************
		*** 1322,1324 ****
		  
		!   my $base_uri = $self->{html}{base_href} || "http://";
		    my $text;
		--- 1322,1324 ----
		  
		!   my $base_uri = $self->{html}{base_href} || '';
		    my $text;
		

	RELAYING_FRAME
		 使ってると引っかかる。
		初期値は 0.031 なんでこんなに低いの?
		score RELAYING_FRAME 3.0

	FROM_AND_TO_SAME
		From: To: が同じだと引っかかるんだけどマイナスしてる…
		初期値は -2.071
		score FROM_AND_TO_SAME 0.1

	CTYPE_JUST_HTML
		本文がHTMLだけのメールは読めないので spamと見なす。:-)
		初期値は 1.665
		score CTYPE_JUST_HTML           3.0

	Subject: 未承諾広告※ をspamにする
		header MISHOUDAKU_KOUKOKU       Subject =~ /\x4c\x24\x3e\x35\x42\x7a\x39\x2d\x39\x70\x22\x28/
		describe MISHOUDAKU_KOUKOKU     Subject: has 未承諾広告※
		score MISHOUDAKU_KOUKOKU        5

		※の部分は様々なバリエーションがあるので最後の \x22\x28はなくていいかも
		header MISHOUDAKU_KOUKOKU       Subject =~ /\x4c\x24\x3e\x35\x42\x7a\x39\x2d\x39\x70/