Появилась задача: делать проверку на спам только для определённых ящиков.
Общая идея такова: после попадания письма в postfix, оно сверяется с фильтром в файле /etc/postfix/transport_spam, если попадает – передаётся на обработку фильтра spamassassin, который описан в master.cf. Он же в свою очередь состоит из проверки на спам и после проверки отдаёт письмо не в postfix, а в procmail, который на основе темы отдаёт её dovecot devivery, который складывает либо в INBOX, либо в JUNK папку соответственно.
Вы можете использовать dovecot-sieve и тогда вам не нужен procmail.
Приступаем: создаём (или добавляем, если уже есть) такую строку в main.cf:
transport_maps = /etc/postfix/transport_spam
Файл /etc/postfix/transport_spam имеет такой формат (двоеточие обязательно!):
<email> <filter>:
в нашем случае имеем:
user@domain.com spamassassin:
где spamassassin – это наш фильтр, который мы позже опишем в master.cf.
Создаём хеш:
# cd /etc/postfix && postmap hash:transport_spam
Описываем сам фильтр в master.cf:
spamassassin unix - n n - - pipe flags=FR user=nobody:mail argv=/usr/bin/spamc -d 127.0.0.1 -e /usr/bin/procmail -m from=${sender} to=${recipient} /etc/procmailrc
Где 127.0.0.1 адрес, где запущен spamassassin
Содержимое файла /etc/procmailrc
SHELL="/bin/bash"
SENDMAIL="/usr/lib/sendmail -oi -t"
LOGFILE="/var/log/procmail.log"
DELIVER="/usr/libexec/dovecot/dovecot-lda -f ${from} -d ${to} "
# fallback:
DEFAULT="$HOME/Maildir/"
MAILDIR="$HOME/Maildir/"
:0 w
* ^X-Spam-Status: YES
| $DELIVER -m Junk
:0 w
| $DELIVER
После этого перечитываем конфиг и на этом всё:
# postfix reload