nakamurakko’s blog

ほぼ IT 技術メモ

迷惑メールを振り分ける

環境

  • Rocky Linux 9.7
  • Postfix 3.5
  • Dovecot 2.3

Postfix に群がる迷惑メールを追い払う に続き、届いてしまった迷惑メールを迷惑メールフォルダーに振り分ける設定を追加した。 Postfix、 Dovecot でメール送受信は出来る環境なので、 SpamAssassinDovecot Sieve を追加して振り分ける。

SpamAssassin をインストール

spamassassin、 spamass-milter-postfix をインストールする。 spamass-milter-postfix は epel-release インストール後にインストール可能になる。インストールに失敗する場合、 dnf config-manager --set-enabled crb を実行してから再実行する。

dnf install spamassassin
dnf install epel-release
dnf config-manager --set-enabled crb
dnf install spamass-milter-postfix

/etc/mail/spamassassin/v310.pre を編集して、 TextCat(言語推測) プラグインを有効にする。

loadplugin Mail::SpamAssassin::Plugin::TextCat

/etc/mail/spamassassin/local.cf を編集して、 rewrite_header をコメントアウト。(振り分けられたメールの件名に「[SPAM]」を追加したい場合は編集不要。)

#rewrite_header Subject [SPAM] # コメントアウト

spamassassin を自動起動させる設定を忘れずに。

systemctl enable spamassassin
systemctl enable spamass-milter

/etc/cron.daily に下記スクリプトを記載した spamassassin-update.sh を配置して、ルールを更新する。(参照 : sa-update)

#!/bin/bash

sa-update
systemctl restart spamassassin

Dovecot、 Sieve プラグインの設定

dovecot-pigeonhole をインストールして Sieve を使える状態にする。

/etc/dovecot/sieve.conf を作成し、下記を記載する。(SpammAssassin が迷惑メールと判定した場合、 Junk フォルダーに振り分ける設定。)

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
    fileinto "Junk";
}

sievec を実行してコンパイルする。

sievec /etc/dovecot/sieve.conf

/etc/dovecot/dovecot.conf を修正する。(sieve を追加。 Sieve は LMTP を使用するため lmtp も追加。)

protocols = imap lmtp sieve

ドメイン名とサーバー名が異なる場合に LMTP の処理が失敗するため、 /etc/dovecot/conf.d/10-auth.conf を修正してユーザー名のみで認証させる。(参照 : auth_username_formatCommon modifier syntaxes and their replacements.)

auth_username_format = %Ln

etc/dovecot/conf.d/10-master.conf に LMTP の設定を追加。

service lmtp {
  # 追加
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }
}

etc/dovecot/conf.d/15-mailboxes.conf にフォルダー名を固定化する設定と、 Junk(迷惑メール)、 Trush(ゴミ箱)は一定日数経過したら削除する設定を追加。(参照 : 1.5. ユーザーを IMAP メールボックスに自動的に登録するLazy Expunge)

namespace inbox {
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = subscribe
    autoexpunge = 30days
    special_use = \Junk
  }
  mailbox Trash {
    auto = subscribe
    autoexpunge = 90days
    special_use = \Trash
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
}

etc/dovecot/conf.d/20-lmtp.conf に LMTP の設定を追加。

protocol lmtp {
  postmaster_address = postmaster@<ドメイン名>
  mail_plugins = sieve
}

etc/dovecot/conf.d/90-sieve.conf に使用する sieve の設定を追加。

sieve_before = /etc/dovecot/sieve.conf

Postfix の設定

/etc/postfix/main.cf に以下を追記する。(smtpd_milters は spamass-milter のソケットが存在する事を、 spamass-milter を起動して確認する。milter_protocol については milter_protocol を参照。)

milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:/var/run/spamass-milter/postfix/sock
non_smtpd_milters = $smtpd_milters

mailbox_transport = lmtp:unix:private/dovecot-lmtp

受信メールが SpamAssassin に迷惑メールと判定されればヘッダーに「X-Spam-flag: YES」が追記され、 Sieve による Junk(迷惑メール)振り分けが確認できたら設定完了。