user icon

pigeonholeとSpamAssassinでSpamを学習させる

前回Dovecotのpigeonholeを扱ったので、更にSpamAssassinと合わせて使ってみます。
※今回の設定は単純に学習させるだけで、スパムチェックやフォルダへの自動移動は別途設定が必要になります。

SpamAssassin

まずは、インストール。
dnf install spamassasin
インストール後、日本語の判定を出来るよう設定を追加します。
  • /etc/mail/spamassassin/local.cf
normalize_charset 1
ok_languages ja en
ok_locales ja en
score FROM_EXCESS_BASE64 0
score MIME_BASE64_TEXT 0
score TVD_SPACE_RATIO 0
normalize_charsetでUTF8対応、ok_languages,ok_localesで記載した以外の言語はスパム寄りに判定されます。scoreの3行は、日本語特有のメール書式をスパム判定から除外するようです(日本語環境だと不自然ではないけど、英語環境だと不自然な感じがするとか)。
  • /etc/mail/spamassassin/v310.pre
loadplugin Mail::SpamAssassin::Plugin::TextCat
ok_languagesを有効にするには、TextCatを有効にする必要が有ります。
  • /etc/sysconfig/spamassassin
SPAMDOPTIONS="-c -m5 -H --razor-home-dir='/var/lib/razor/' --razor-log-file='sys-syslog' -l -s /var/log/spamd.log"
デフォルトではspamcコマンドで学習出来ない設定になっているので、-lを足します。また観察用にログをspamd.logに出力させます。
lintオプションで何も出力されない事を確認して、起動します。
spamassassin --lint
# no output
systemctl enable spamassassin --now
spamcが動くかサンプルで確認します。実行後$?を出力して、エラーコードが0である事を確認します。
spamc -L spam < /usr/share/doc/spamassassin/sample-spam.txt
echo $?
# 0 が出力される

Dovecot

  • conf.d/15-mailboxes.conf
namespace inbox {
  #...
  mailbox Junk {
    special_use = \Junk
    # 自動生成して購読を追加
    auto = subscribe
  }
  • conf.d/20-imap.conf
protocol imap {
  # imap_sieveを追加
  mail_plugins = $mail_plugins imap_sieve
}
  • conf.d/90-sieve.conf
plugin {
  sieve_plugins = sieve_extprograms sieve_imapsieve
  sieve_implicit_extensions = +vnd.dovecot.report
 
  # From elsewhere to Spam folder
  imapsieve_mailbox1_name = Junk
  imapsieve_mailbox1_causes = COPY
  imapsieve_mailbox1_before = file:/usr/local/lib/dovecot/sieve/spam/report-spam.sieve
  # From Spam folder to elsewhere
  imapsieve_mailbox2_name = *
  imapsieve_mailbox2_from = Junk
  imapsieve_mailbox2_causes = COPY
  imapsieve_mailbox2_before = file:/usr/local/lib/dovecot/sieve/spam/report-ham.sieve

  sieve_pipe_bin_dir = /usr/local/lib/dovecot/sieve/spam
  sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
}
スクリプト用フォルダとファイルを作成します。
mkdir /usr/local/lib/dovecot/sieve/spam
chown vmb.vmb /usr/local/lib/dovecot/sieve/spam
  • /usr/local/lib/dovecot/sieve/spam/report-spam.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "sa-learn-spam.sh" [ "${username}" ];
  • /usr/local/lib/dovecot/sieve/spam/report-ham.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.mailbox" "*" {
  set "mailbox" "${1}";
}

if string "${mailbox}" "Trash" {
  stop;
}

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "sa-learn-ham.sh" [ "${username}" ];
  • /usr/local/lib/dovecot/sieve/spam/sa-learn-spam.sh
#!/bin/sh
exec /usr/bin/spamc -u vmb -L spam
exit 0
  • /usr/local/lib/dovecot/sieve/spam/sa-learn-ham.sh
#!/bin/sh
exec /usr/bin/spamc -u vmb -L ham
exit 0
sieveには不要ですが、shには実行権限を付ける必要が有ります。
chown vmb.vmb /usr/local/lib/dovecot/sieve/spam/*
chmod +x /usr/local/lib/dovecot/sieve/spam/sa-learn-*.sh

RoundCube

RoundCubeでメールを迷惑メールフォルダへ入れるとSpamとして学習され、また迷惑メールフォルダから別のフォルダへ移動するとHam(スパムでない)として学習されます。
一回の動作ごとに、/var/log/spamd.logに以下のような実行ログが出力されました。
spamd: connection from ::1 [::1]:57804 to port 783, fd 5
spamd: setuid to vmb succeeded
spamd: Tell: Setting local for vmb:5000 in 0.0 seconds, 1113 bytes
info: prefork: child states: II
チェック用にコマンドラインで迷惑メールフォルダのメールファイルをspamcで食わせると、既に学習済と出ました。
spamc -L spam -u vmb < /var/mail/vhosts/virtual.localdomain/Maildir/aikawa/.Junk/cur/[メールファイル]
# Message was already un/learned
Facebooktwitterlinkedintumblrmail

Tags: ,

名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)