Вопрос или проблема
Я успешно настроил Postfix + Dovecot + IMAP. И я только что также установил spamassassin
, spamc
, spamass-milter
и настроил плагин imap_sieve
для борьбы со спамом.
Вывод команды doveconf -n
:
# 2.3.13 (89f716dc2): /etc/dovecot/dovecot.conf
# Версия Pigeonhole 0.5.13 (cdd19fe3)
# ОС: Linux 5.10.0-33-amd64 x86_64 Debian 11.11
# Имя хоста: mail.example.com
mail_debug = yes
mail_location = maildir:~/Maildir
mail_privileged_group = mail
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext imapsieve vnd.dovecot.imapsieve
namespace inbox {
inbox = yes
location =
mailbox Drafts {
auto = no
special_use = \Drafts
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox Spam {
auto = subscribe
special_use = \Junk
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
prefix =
}
passdb {
args = %s
driver = pam
}
plugin {
imapsieve_mailbox1_before = file:/var/lib/dovecot/sieve.d/default.sieve
imapsieve_mailbox1_name = INBOX
sieve_plugins = sieve_imapsieve
}
protocols = imap sieve
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
mode = 0660
user = postfix
}
}
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
}
ssl = required
ssl_cert = </etc/ssl/mail/domain.crt
ssl_key = # скрыто, используйте -P для отображения
userdb {
driver = passwd
}
protocol imap {
mail_max_userip_connections = 20
mail_plugins = " imap_sieve"
}
Содержимое /var/lib/dovecot/sieve.d/default.sieve
:
require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
fileinto "Spam";
stop;
}
И я протестировал свою настройку с помощью:
# Выполнено вне моей сети
wget https://spamassassin.apache.org/gtube/gtube.txt
swaks --to [email protected] --body gtube.txt
И это работает. Электронное письмо успешно помечается как спам (что очевидно по X-Spam-Flag: YES
в заголовках). Но фильтр Sieve не работает так, как ожидалось. Он должен перемещать сообщение в мою папку “Спам”, но вместо этого он копирует сообщение в папку “Спам”, но только после того, как я открыл сообщение. Сообщение остается внутри ВХОДЯЩЕЙ.
Как я могу сделать так, чтобы сообщение перемещалось в папку “Спам” (не копировалось)? И почему фильтр Sieve работает только после того, как я открываю сообщение в своем почтовом клиенте?
Ваш сценарий использования звучит так, как будто вы имели в виду использовать
sieve_before
: вызывается при доставке входящей почты в почтовые ящики пользователей; это происходит через dovecot-lda или LMTP; но вместо этого настроеноimapsieve_mailbox1_before
: работает, когда сообщения создаются или их атрибуты изменяются почтовым агентом пользователя через протокол IMAP.
Ответ или решение
Решение проблемы с копированием писем в Dovecot с использованием плагина imap_sieve
Проблема, с которой вы столкнулись, связана с тем, что в конфигурации Dovecot применен неправильный подход к обработке входящих сообщений с использованием Sieve-скриптов. Чтобы разобраться в данной ситуации, давайте подробно рассмотрим ваш запрос и приведем оптимальное решение.
Анализ вашей конфигурации
Из описания видно, что ваша текущая настройка использует параметр imapsieve_mailbox1_before
, который на самом деле обрабатывает сообщения в момент их непосредственного изменения через IMAP-клиент, а не во время доставки на сервер. Это объясняет, почему Sieve-фильтр не работает должным образом до тех пор, пока сообщение не будет открыто в почтовом клиенте — фильтр срабатывает не на этапе получения, а при взаимодействии клиента с почтовым сервером.
Ваша часть конфигурации:
plugin {
imapsieve_mailbox1_before = file:/var/lib/dovecot/sieve.d/default.sieve
imapsieve_mailbox1_name = INBOX
}
Этот код вызывает фильтрацию только после взаимодействия. Чтобы ваша система перемещала письма во время входящей доставки, вам необходимо использовать sieve_before
.
Рекомендуемое решение
Для изменения поведения вашего Sieve-фильтра, необходимо выполнить следующие шаги:
-
Измените конфигурацию Dovecot. Замените
imapsieve_mailbox1_before
наsieve_before
. Это необходимо для того, чтобы делать фильтрацию на этапе получения сообщений, а не во время работы IMAP-клиента.Обновленная часть конфигурации будет выглядеть следующим образом:
plugin { sieve_before = file:/var/lib/dovecot/sieve.d/default.sieve }
-
Проверьте настройку Sieve-скрипта. Убедитесь, что ваш Sieve-скрипт настроен корректно для обработки сообщений перед тем, как они будут помещены в папку INBOX. Ваша текущая конфигурация выглядит правильно и должна перемещать сообщения с пометкой
X-Spam-Flag: YES
в папкуSpam
.Скрипт остается следующим:
require "fileinto"; if header :contains "X-Spam-Flag" "YES" { fileinto "Spam"; stop; }
-
Перезагрузите Dovecot. После внесения изменений в конфигурацию, не забудьте перезагрузить Dovecot для применения новых настроек.
sudo systemctl restart dovecot
Заключение
После внесения указанных изменений, все новые сообщения с флагом X-Spam-Flag: YES
должны автоматически перемещаться в папку Spam
без необходимости открытия в почтовом клиенте. Таким образом, вы устраните проблему с копированием сообщений и улучшите управление спамом в вашей почтовой системе Dovecot.
Если у вас останутся вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться за поддержкой.