Last Update 2005.05.12 

  •  Fedora Core 3による自宅サーバー構築(CUIベース)
    •  ソフトウエア編(運用)
      •  スパムメールの学習設定(SpamAssassin + Procmail)
        •  SpamAssassinに学習させましょう -2005年05月12日
          誤検知はけっこうあります。 送る方も引っ掛かり難いように内容を微妙に変え
          て送って来ます。 その都度、家族からメールを受け取って学習させるのも手間
          です。
          そこでWebメールから学習用のフォルダにメールを移動させて、そのフォルダ
          の中身を定期的にスクリプトで学習させます。
          (SquirrelMailのプラグインに似た処理が出来る物がありますが、思った動きを
          してくれなかったので自作です)

          ルール:
          「Ham」にはスパムじゃないのにスパムと判定されて「Spam」や「Doubt」に振り
          分けられてしまったメールを入れて「$HOME/smbhome」に「.Ham」って名前の空
          ファイルを作ります。
          「Learn」にはスパムなのに「受信箱」や「Doubt」に入ってしまったメールを入
          れて「$HOME/smbhome」に「.Spam」って名前の空ファイルを作ります。
          「.Ham」及び「.Spam」はユーザーが任意で学習を有効にしたい時に作成します。

          −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
          (修正 2005.05.27)
          今までのスクリプトを短い間隔で起動し、大量の学習を一気におこなうと後続の
          スクリプトとバッティングします。(但し処理は正常に行われています)
          排他処理で回避しました。 文字が濃い緑の部分が前回からの修正部分です。
          −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

          では作業です。
          [root@station ~]# su - user1
          [user1@station ~]$ mkdir Maildir/.Ham
          [user1@station ~]$ chmod 700 Maildir/.Ham
          [user1@station ~]$ mkdir Maildir/.Learn
          [user1@station ~]$ chmod 700 Maildir/.Learn
          [user1@station ~]$ exit
          [root@station ~]# vi sh/sa-learn_check.sh
          
          #!/bin/sh
          PASSWD="/etc/passwd"
          FLGHAM=".ham"
          FLGSPAM=".spam"
          PROG="sa-learn"
          PROGDIR="/usr/bin"
          LOCK="/tmp/sa-learn_check.lock"
          
          clean_up () {
              local pid
              [ -L $LOCK ] || return 1
              pid=$(ls -l $LOCK | sed 's/.*-> //')
              if [ $$ -eq $pid ]; then
                  rm -f $LOCK > /dev/null 2>&1
              fi
          }
          
          trap clean_up EXIT
          
          [ -L $LOCK ] && exit 1
          ln -s $$ $LOCK > /dev/null 2>&1
          
          while read LINE; do
              USERNAME=`echo $LINE | cut -d':' -f 1`
              HOMEDIR=`echo $LINE | cut -d':' -f 6`
          
          ### Ham Learn Section
              if [ -f $HOMEDIR/smbhome/$FLGHAM ]; then
                  if [ -d $HOMEDIR/Maildir/.Ham/cur ]; then
                      ls -l $HOMEDIR/Maildir/.Ham/cur | (
                          while read MAILFILE; do
                              set -- $MAILFILE
                              if [ -f $HOMEDIR/Maildir/.Ham/cur/$9 ]; then
                                  su $USERNAME -s "/bin/bash" -c "$PROGDIR/$PROG --ham $HOMEDIR/Maildir/.Ham/cur/$9 >> $HOMEDIR/smbhome/sa-learn_ham.log"
                                  su $USERNAME -s "/bin/bash" -c "mv -fb $HOMEDIR/Maildir/.Ham/cur/$9 $HOMEDIR/Maildir/new/"
                              fi
                          done
                      )
                  fi
                  if [ -d $HOMEDIR/Maildir/.Ham/new ]; then
                      ls -l $HOMEDIR/Maildir/.Ham/new | (
                          while read MAILFILE; do
                              set -- $MAILFILE
                              if [ -f $HOMEDIR/Maildir/.Ham/new/$9 ]; then
                                  su $USERNAME -s "/bin/bash" -c "$PROGDIR/$PROG --ham $HOMEDIR/Maildir/.Ham/new/$9 >> $HOMEDIR/smbhome/sa-learn_ham.log"
                                  su $USERNAME -s "/bin/bash" -c "mv -fb $HOMEDIR/Maildir/.Ham/new/$9 $HOMEDIR/Maildir/new/"
                              fi
                          done
                      )
                  fi
              fi
          ### Spam Learn Section
              if [ -f $HOMEDIR/smbhome/$FLGSPAM ]; then
                  if [ -d $HOMEDIR/Maildir/.Learn/cur ]; then
                      ls -l $HOMEDIR/Maildir/.Learn/cur | (
                          while read MAILFILE; do
                              set -- $MAILFILE
                              if [ -f $HOMEDIR/Maildir/.Learn/cur/$9 ]; then
                                  su $USERNAME -s "/bin/bash" -c "$PROGDIR/$PROG --spam $HOMEDIR/Maildir/.Learn/cur/$9 >> $HOMEDIR/smbhome/sa-learn-spam.log"
                                  su $USERNAME -s "/bin/bash" -c "mv -fb $HOMEDIR/Maildir/.Learn/cur/$9 $HOMEDIR/Maildir/.Trash/new/"
                              fi
                          done
                      )
                  fi
                  if [ -d $HOMEDIR/Maildir/.Learn/new ]; then
                      ls -l $HOMEDIR/Maildir/.Learn/new | (
                          while read MAILFILE; do
                              set -- $MAILFILE
                              if [ -f $HOMEDIR/Maildir/.Learn/new/$9 ]; then
                                  su $USERNAME -s "/bin/bash" -c "$PROGDIR/$PROG --spam $HOMEDIR/Maildir/.Learn/new/$9 >> $HOMEDIR/smbhome/sa-learn-spam.log"
                                  su $USERNAME -s "/bin/bash" -c "mv -fb $HOMEDIR/Maildir/.Learn/new/$9 $HOMEDIR/Maildir/.Trash/new/"
                              fi
                          done
                      )
                  fi
              fi
          done < $PASSWD
          rm -f $LOCK
          
          ※sa-learn_check.shのダウンロードはこちらから

           定期的に実行します -2005年05月12日
          作成したスクリプトを定期的に実行します。
          [root@station ~]# chmod 700 sh/sa-learn_check.sh
          [root@station ~]# crontab -e
          */15 * * * * /root/sh/sa-learn_check.sh | nkf -j
          
          例は15分毎ですが、サーバーの負荷とメールの使用頻度を考慮して決めて下さい。
          これを動かすと
          「Ham」に入れたメールが「スパムじゃない」学習の後、「受信箱」に移動します。
          「Learn」に入れたメールが「スパムメール」の学習の後、「.Trash(ゴミ箱)」に移
          動します。 使って1ヶ月が経過しますが、メールの消失は無いので大丈夫だと思い
          ますが、無保証のスクリプトですので、覚悟してから使って下さい(怖)
          初期バージョンは消失やメールが消せなくなりました(泣) これはバージョン3です(笑)

          なお、POP3のメーラーは一定期間サーバーにメールを残す設定にしていないと学
          習させたい時に移動させるメールが無くなってしまうのでとても面倒な作業になりま
          す。 私は2週間残す設定で使っています。

        Create DATE : 2005.05.02
        雑記帳から転載 : 2005.05.12
        排他処理を追加(排他処理参考資料「UNIXシェルスクリプトハンドブック」) : 2005.05.27