ユーザ用ツール

サイト用ツール


ubuntu-server-10-04:spamassassin

SpamAssassin でスパムメール除去

Fetchmail で収集してきたメールからスパムを除去する。

流れとしては Fetchmail → Procmail → SpamAssassin

Procmail の .procmailrc 内で SpamAssassin に処理を引き渡すことで動作する。

インストール

SpamAssassin と日本語用のスパムルールをインストール。

処理は postfix → procmail → SpamAssassin → procmailで振り分け となるので procmail が入っていな場合は procmail もインストール。

$ sudo apt-get install spamassassin spamassassin-rules-ja

なんか22個インストールされた。

設定ファイル

  • SpamAssassin 全体の設定ファイル /etc/spamassassin/local.cf
  • ロードするモジュールを記述 /etc/spamassassin/*.pre
  • 各ユーザのスパムルール $HOME/.spamassassin/user_prefss
  • /usr/share/spamassassin/ に local.cf のテンプレートがある

デーモンの設定

/etc/default/spamassassin を編集して Spamassassin のデーモン spamd の設定をする。

$ sudo vi /etc/default/spamassassin

デフォルトではデーモンとして起動しないようになっている。“ENABLED=1” にしてデーモンとして起動させる。

# Change to one to enable spamd
#ENABLED=0
ENABLED=1

他のブログでは “–create-prefs” を OPTIONS= に追加するとありましたが、最初から入ってた。

  • –create-prefs : 各ユーザの設定ファイルを作成する
OPTIONS="--create-prefs --max-children 5 --helper-home-dir"

Spamassassin のルールを自動更新する。

#CRON=0
CRON=1

Spamassassin を再起動

$ sudo /etc/init.d/spamassassin restart

こんなエラーがでたが、もう一度再起動したら出なかった。。。ま、いいか。

Restarting SpamAssassin Mail Filter Daemon: No /usr/bin/perl found running; none killed.
spamd.

再起動2回目

Restarting SpamAssassin Mail Filter Daemon: spamd.

Spamassassin の設定

プラグインファイルを編集。

$ sudo vi /etc/spamassassin/v310.pre

言語推定プラグインを使用する。

# TextCat - language guesser
#
#loadplugin Mail::SpamAssassin::Plugin::TextCat
loadplugin Mail::SpamAssassin::Plugin::TextCat

個人設定ファイル

個人設定ファイルを用意する。

$ mkdir ~/.spamassassin
$ touch ~/.spamassassin/user_prefs

~/.spamassassin/user_prefs の中に

whitelist_from *hoge.ne.jp

とすると、ホワイトリストの設定ができる。

スパムメールを入れるフォルダを用意

スパムメール専用のメールフォルダを作成。フォルダは Thunderbird などのメールクライアントからでも作れる。

以下のコマンドで作ったフォルダがなぜか Thunderbird から見れなかったので、結局 Thunderbird で作ったフォルダを使うことにした。

$ /usr/bin/maildirmake -f _Spam ~/Maildir/
  • オプション
    • -f : 既存のメールディレクトリにフォルダを作成
    • Spam : 作成するフォルダの名前(任意の名前)
    • ~/Maildir/ : 既存のメールディレクトリの場所

ついでにスパムメールと誤判定されたメールを入れるフォルダを作成。

$ /usr/bin/maildirmake -f _NotSpam ~/Maildir/

Spamassassin にメールを処理させる

Spamassassin は通常 procmail から呼び出され、スパム判定を行った後に再度 procmail でスパムメールを他のフォルダに振り分ける。

まずは、postfix が受信したメールを procmail に処理させなければならないのだが、方法を2つ見つけた。

  1. procmail を postfix のメールを振り分ける外部プログラムとして postfix の設定ファイルに記述する
  2. .forward ファイルでメールを procmail に転送する

最初の方法は設定ファイルを書き換えるので root 権限が必要。2番目の方法はユーザが自分で設定できる。

個人的趣味では2番目かなぁ。

外部プログラムに登録する方法

$ sudo vi /etc/postfix/main.cf

以下を追加

mailbox_command = /usr/bin/procmail

postfix を再起動

$ sudo /etc/init.d/postfix restart

.forward ファイルを使う方法

ホームディレクトリに .forward ファイルを作成する。

$ vi ~/.forward

以下を記述

"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 「ユーザ名」"
* 「ユーザ名」 の部分は振り分けを行うユーザネームに変更

procmail から Spamassassin を呼び出して振り分け

procmail の設定に関しては詳細を省く。

$ vi ~/.procmailrc

下記を追加する。

# メールヘッダー中に「 X-Spam-*** 」の記述がなければ spamassassin を起動します
:0fw
*!^X-Spam.*
|spamassassin

# メールヘッダー中に"X-Spam-Status: Yes"の記述があれば、
# スパムディレクトリにメールを格納
:0
* ^X-Spam-Status: Yes
._Spam/

Spamassassin をテストする

GTUBE と呼ばれる特殊な文字列をメールで送信すると、強制的にスパムとして扱われる。以下が GTUBE 文字列

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

これを送信して、スパム専用フォルダに振り分けられていればOK。

スパムメールを学習させる

スパムメール学習させる。スパムメールを学習させるコマンド。

$ /usr/bin/sa-learn --spam /home/「ユーザ名」/Maildir/._Spam/

スパムメールと誤判定されたメールを学習させるコマンド。

$ /usr/bin/sa-learn --ham /home/「ユーザ名」/Maildir/cur
<code>

  * 「ユーザ名」は自分のユーザネームに置き換える

とりあえずやってみる。

<code>
$ /usr/bin/sa-learn --spam ~/Maildir/._Spam/
Learned tokens from 2 message(s) (3 message(s) examined)

先ほど作成した “~/.spamassassin” を見てみると

$ ls ~/.spamassassin/
bayes_seen  bayes_toks  user_prefs

2つのファイルが作成されていた。

このコマンドをシェルスクリプトにして cron で毎日実行する。以下のようなスクリプトを作る。“spam-learn.sh”という名前で作成した。

#! /bin/sh

#
# Spamassassin spam learn script
#

SPAM_DIR="「スパム専用フォルダへのフルパス」"
NOT_SPAM_DIR="「非スパム専用フォルダへのフルパス」"

SA_LEARN="/usr/bin/sa-learn"


# check program and directories

if [ ! -d $SPAM_DIR ]; then
    echo "\"$SPAM_DIR\" is not found."
    exit 1
elif [ ! -d $NOT_SPAM_DIR ]; then
    echo "\"$NOT_SPAM_DIR\" is not found."
    exit 1
fi

if [ ! -x $SA_LEARN ]; then
    echo "\"$SA_LEARN\" is not exist or can not execute."
    exit 1
fi


# learn spam mails
echo "$SA_LEARN --spam $SPAM_DIR"
$SA_LEARN --spam $SPAM_DIR

# learn NOT-spam mails
echo "$SA_LEARN --ham $NOT_SPAM_DIR"
$SA_LEARN --ham $NOT_SPAM_DIR
  • 「スパム専用フォルダへのフルパス」: “/home/user/Maildir/._Spam/cur” など

パーミッションを変更して実行可能に

$ chmod 755 ./spam-learn.sh

crontab に登録する。

$ crontab -e

午前3時に実行するならこんな感じで

0 3 * * * test -x /「スクリプトへのフルパス」/spam-learn.sh && /「スクリプトへのフルパス」/spam-learn.sh

実行結果メールがいらない場合は

0 3 * * * test -x /「スクリプトへのフルパス」/spam-learn.sh && /「スクリプトへのフルパス」/spam-learn.sh  > /dev/null 2>&1
ubuntu-server-10-04/spamassassin.txt · 最終更新: 2010/10/28 18:30 by admin