NG ワードをSpamAssassinに登録する

SpamAssassinはメールにある単語を調べそれが登録されているものであった場合に点を高くしてくれる機能があります。

最近来たspamを例にその手順を説明してみます。登録する単語は以下の5つです。
突然の   

返信不要

報酬

男女

女性会員
それぞれは普通のメールにもある単語なので1つだけでspamと判定してしまうとまずいので個々には少ない点を割り振り、それが積算されて高くなるようにするのがポイントです。

メールはJIS形式で来るのでこれをそのまま登録しても検知してくれません。JISに変換した本体だけを使うことにします。なをこの作業をするにはメールサーバーにsshでログインして自分あてのメールファイルをどこかにコピーするという作業になるのでその権限を持っていなくてはなりません。rootでログインして作業してもかまいません。

1)あらかじめメールサーバーにsshでログインしておく

2)以下を本文に自分にメールを送る
LOCAL_totsuzen    突然の   
LOCAL_henshinfuyo    返信不要
LOCAL_houshuu   報酬
LOCAL_danjo    男女
LOCAL_joseikaiin     女性会員

3)到着した頃 以下のコマンドでメールをコピーします。メーラで読み出してしまう前にコピ−してください。(例ではメールのアカウントは yamada として作業しています)
cp /var/mail/yamada ~

4)メールのコピーを編集してSpamAssassin形式にする

ステップ1
vi ~/yamada としてこのファイルを開くとメール本文は以下のようになっているはずです。ヘッダとかシグネチュアはもちろん削除します。
LOCAL_totsuzen    ^[$BFMA3$N^[(B
LOCAL_henshinfuyo    ^[$BJV?.ITMW^[(B
LOCAL_houshuu   ^[$BJs=7^[(B
LOCAL_danjo    ^[$BCK=w^[(B
LOCAL_joseikaiin     ^[$B=w@-2q0w^[(B
ステップ2
このうち ^[$B と ^[(B を / に置き換えます(以下)。これらはJISコード変移のエスケープシーケンスです。
LOCAL_totsuzen    /FMA3$N/
LOCAL_henshinfuyo    /JV?.ITMW/
LOCAL_houshuu   /Js=7/
LOCAL_danjo    /CK=w/
LOCAL_joseikaiin     /=w@-2q0w/
ステップ3
今度はSpamAssassin(perl)で 演算など特殊な意味を持つASCII( - とか = とか @ とかいった文字)の前にバックスラッシュ(\)を追加します。
これが実際のデータです(htmlだと消えてしまうのでtxtとして読んでいます)

ステップ4
これにscore と describe を追加して完成です。
これが実際のデータです(htmlだと消えてしまうのでtxtとして読んでいます)

5)これをSpamAssassinのloca.lcfに追加します。

scoreが点数です。この合計が5.2になるとspamと判定されるのでそれを頭に、適当に割り振ってください。

describeは見つかったときの説明文です。

6)追加したら
spamassassin --lint
で文法エラーが無いかどうかチェックし問題が無いようだったらspamdを再起動すると有効になります。

7)もっと登録します。

実際のspamにはもっと端的にspamと判定できる組織名とか氏名が書いてある場合がありますので同様に登録してください。当然こういう場合はもっと点を高くしておくとよろしいでしょう。

8) metaを使ってもっと高くしてみましょう。

metaというのは複数の定義をまとめてくれる機能です。

以下の例では最初の3つの単語が全部1つのメールにあったとき更に5.0を追加します。
meta LOCAL_deai_all  LOCAL_totsuzen && LOCAL_henshinfuyo && LOCAL_houshuu
describe LOCAL_deai_all Totsuzen and HenshinFuyo and Houshuu
score LOCAL_deai_all 5.0
&& 以外に || も使えます。以下の例はLOCAL_totsuzenがあった上で、LOCAL_henshinfuyo か LOCAL_houshuuのどれかがあったらという意味になります。
meta LOCAL_deai_all2  LOCAL_totsuzen && ( LOCAL_henshinfuyo || LOCAL_houshuu )
describe LOCAL_deai_all2 Totsuzen and ( HenshinFuyo or Houshuu )
score LOCAL_deai_all2 2.0

Nikki Top