Плагин imap_sieve Dovecot копирует сообщения вместо перемещения сообщений.

Вопрос или проблема

Я успешно настроил 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-фильтра, необходимо выполнить следующие шаги:

  1. Измените конфигурацию Dovecot. Замените imapsieve_mailbox1_before на sieve_before. Это необходимо для того, чтобы делать фильтрацию на этапе получения сообщений, а не во время работы IMAP-клиента.

    Обновленная часть конфигурации будет выглядеть следующим образом:

    plugin {
     sieve_before = file:/var/lib/dovecot/sieve.d/default.sieve
    }
  2. Проверьте настройку Sieve-скрипта. Убедитесь, что ваш Sieve-скрипт настроен корректно для обработки сообщений перед тем, как они будут помещены в папку INBOX. Ваша текущая конфигурация выглядит правильно и должна перемещать сообщения с пометкой X-Spam-Flag: YES в папку Spam.

    Скрипт остается следующим:

    require "fileinto";
    
    if header :contains "X-Spam-Flag" "YES" {
       fileinto "Spam";
       stop;
    }
  3. Перезагрузите Dovecot. После внесения изменений в конфигурацию, не забудьте перезагрузить Dovecot для применения новых настроек.

    sudo systemctl restart dovecot

Заключение

После внесения указанных изменений, все новые сообщения с флагом X-Spam-Flag: YES должны автоматически перемещаться в папку Spam без необходимости открытия в почтовом клиенте. Таким образом, вы устраните проблему с копированием сообщений и улучшите управление спамом в вашей почтовой системе Dovecot.

Если у вас останутся вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...