‘pigeonhole’ タグのアーカイブ

aikawa

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
aikawa

ソースからビルドしたDovecotにpigeonholeを入れる

以前Dovecotをソースからビルドしましたが、dnfでdovecot-pigeonholeを入れても(当然)動かなかったので、別途入れる事にしました。








https://pigeonhole.dovecot.org/download.html

こちらから安定版リリースを取得。
いつの間にか、pigeonholeとmanagesieveが一つのパッケージにまとまっていました。

make

デフォルトで/usr/localに入るようで、configureでディレクトリ指定のオプションは不要でした。

tar xzf dovecot-2.3-pigeonhole-0.5.20.tar.gz 
cd dovecot-2.3-pigeonhole-0.5.20/
./configure
make
make install

Dovecot 設定

/usr/local/share/doc/dovecot/example-config/conf.d/ にsieveのconfが出来るので、sieve関連のファイルを/usr/local/etc/dovecot/conf.d/へコピーします。

cp /usr/local/share/doc/dovecot/example-config/conf.d/*sieve*.conf /usr/local/etc/dovecot/conf.d/
  • 20-managesieve.conf

以下のコメント化を解きます。

protocols = $protocols sieve
service managesieve-login{
  inet_listener sieve {
    port = 4190
  }
}
service managesieve{
}

90-sieve.confはデフォルトのままで動作するので、編集不要です。

LMTP配信

以下、sieveがLMTPで動作するように設定します。

  • 10-master.conf
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }
}

今回はRoundCubeへログインするアカウントが、メールアドレス形式(yamada@virtual.localdomain 等)なので不要ですが、ユーザ名のみ(yamada 等)の場合はauth_username_format = %nを設定します。
※下手に設定するとログイン出来なくなります。

  • 20-lmtp.conf

postmasterは実在するユーザの誰かを指定します。

protocol lmtp {
  postmaster_address = yamada@virtual.localdomain
  mail_plugins = $mail_plugins sieve
}

編集が終わったら、リロードします。

doveadm reload

Postfix

  • /etc/postfix/main.cf

virtualユーザを対象にします。

virtual_transport = lmtp:unix:private/dovecot-lmtp

RoundCube

  • config/config.inc.php

pluginsにmanagesieveを追加します。

$config['plugins'] = ['acl', 'managesieve'];

RoundCubeも同じサーバで動作しているので、plugins側の設定ファイルはなくても動作しますが、一応設定ファイルをコピーしておきます。

cp -p plugins/managesieve/config.inc.php.dist plugins/managesieve/config.inc.php

サーバが異なる場合は、managesieve_hostを変更して下さい。

RoundCubeにログインして設定を開くと、フィルターが追加されています。

動作するか確認するため作成を押して、件名 Subjectに「test」が含まれていたらtestフォルダへ移動させてみます。

これで自分宛に件名を「test」を含んだメールを送って、テストフォルダへ到達していれば完了です。