Это было мое окончательное решение после исследований и помощи от @tarleb
Моя доставка почты происходила через программу sendmail
, которая добавляла некоторые дополнительные заголовки к моей почте. Я мог бы использовать mitter (почтовый фильтр) для фильтрации входящей почты и отказаться от использования sendmail
, однако я решил перейти на Dovecot LDA для доставки.
Мой первоначальный фильтр был в начале файла Postfix master.cf
:
smtp inet n - - - - smtpd -o content_filter=spamassassin
И в конце файла:
spamassassin unix - n n - - pipe
user=debian-spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}
Я изменил конец файла для использования локальной доставки Dovecot на:
spamassassin unix - n n - - pipe
flags=DROhu user=vmail:vmail argv=/usr/bin/spamc -f -e
/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}
Теперь отредактируйте Postfix main.cf
и добавьте (необязательно, проверьте (3) ниже):
spamassassin_destination_recipient_limit = 1
Теперь ваша почта будет доставляться через Dovecot LDA без изменения заголовков. Для любопытных, вот некоторые подробности моего конфига:
user+nospam@example.com
будут доставлены в user@example.com
inbox) -. Вот почему я добавил -d ${user}@${nexthop}
это удалит +
и все до домена. Чтобы включить эту возможность, также не забудьте добавить recipient_delimiter = +
в main.cf
;flags=DROhu
, они не добавляют ничего аномального, но их можно понять здесь: http://www.postfix.org/pipe.8.html;spamassassin_destination_recipient_limit = 1
требуется для того, чтобы каждый получатель индивидуально обрабатывался spamassassin. Это требуется из-за D
флага выше (Включает X-Original-To
заголовок). Если у вас установлен флаг D
и вы не установили spamassassin_destination_recipient_limit = 1
, письма с несколькими пунктами назначения не будут доставлены! Если вам не важен этот заголовок, вы можете убрать флаг, и он не понадобится. Редактирование: Бонусный контент - Переместите ваш СПАМ в папку Junk
!
Вы также можете настроить Dovecot на перемещение почты, обнаруженной как SPAM, в папку Junk
IMAP. Это, безусловно, облегчит вам жизнь. Просто выполните следующее:
Отредактируйте /etc/dovecot/conf.d/15-mailboxes.conf
и откомментируйте / добавьте папку Junk
с (должно быть в разделе namespace inbox
рядом с mailbox Trash
):
mailbox Junk {
special_use = \Junk
}
Установите dovecot-sieve
с помощью apt-get install dovecot-sieve
;
Отредактируйте /etc/dovecot/conf.d/90-sieve.conf
и закомментируйте строку: #sieve = ~/.dovecot.sieve
Редактируем /etc/dovecot/conf.d/90-plugin.conf
так:
plugin {
sieve = /etc/dovecot/sieve/default.sieve
}
Отредактируйте /etc/dovecot/conf.d/15-lda.conf
и /etc/dovecot/conf.d/20-lmtp.conf
для соответствия:
protocol lda/lmtp { # не копируйте/вставьте эту строку!
mail_plugins = $mail_plugins sieve
}
WARNING: У вас могут быть другие настройки в строке protocol
, сохраните их. Строка protocol lda/lmtp
изменяется в файлах, сохраните оригинал.
Создайте папку /etc/dovecot/sieve/
Создайте файл /etc/dovecot/sieve/default.sieve
с таким содержимым:
require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
fileinto "Junk"
}
Измените права доступа к папке на пользователя и группу виртуальной почты следующим образом: chown vmail:vmail /etc/dovecot/sieve/ -R
. Если вы пропустите это, dovecot будет жаловаться!
Перезапустите все: service postfix restart; service dovecot restart; service spamassassin restart
Попробуйте отправить письмо на какой-нибудь email на сервере (с внешнего сервера), сначала обычное письмо, а затем другое с такой темой: XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
. Второе письмо должно попасть в папку Junk
, а первое - в папку "Входящие".
Если это не сработает с первой попытки, посмотрите журналы: tail -f /var/log/mail.log
и отправьте письмо, пока работает tail
. Хорошая рабочая установка должна сообщать о сохраненной почте в почтовый ящик 'INBOX'
или сохраненной почте в почтовый ящик 'Junk'
.