Dovecot Sieve: серверная фильтрация почты по правилам

Что такое Sieve и зачем он нужен

Sieve — стандартизованный язык фильтрации почты (RFC 5228), выполняемый на стороне сервера. В отличие от правил Outlook или Thunderbird, которые работают только при запущенном клиенте, Sieve-скрипты обрабатывают письма в момент доставки — до того как пользователь откроет почтовый клиент.

Возможности Sieve:

  • Сортировка писем по папкам на основе заголовков, отправителя, темы
  • Автоматическое перенаправление (redirect) и копирование писем
  • Автоответчик (vacation) — ответ «Я в отпуске»
  • Отклонение писем с уведомлением отправителя
  • Установка флагов (прочитано, важное, помечено)
  • Интеграция с SpamAssassin — перемещение спама в соответствующую папку

В Dovecot реализация Sieve входит в плагин Pigeonhole. Он включает LDA/LMTP-плагин для обработки скриптов при доставке и сервер ManageSieve (порт 4190) для удалённого управления правилами из почтовых клиентов.

Установка и активация Pigeonhole

Устанавливаем плагин Sieve для Dovecot:

# Ubuntu/Debian
sudo apt install dovecot-sieve dovecot-managesieved -y

# CentOS/RHEL
sudo dnf install dovecot-pigeonhole -y

Активируем плагин в конфигурации Dovecot. В /etc/dovecot/conf.d/20-lmtp.conf:

protocol lmtp {
  mail_plugins = $mail_plugins sieve
}

В /etc/dovecot/conf.d/15-lda.conf:

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Настройка самого Sieve в /etc/dovecot/conf.d/90-sieve.conf:

plugin {
  # Пользовательский скрипт (в домашнем каталоге)
  sieve = file:~/sieve;active=~/.dovecot.sieve

  # Глобальные скрипты (до пользовательских)
  sieve_before = /etc/dovecot/sieve-before.d/

  # Глобальные скрипты (после пользовательских)
  sieve_after = /etc/dovecot/sieve-after.d/

  # Максимальный размер скрипта
  sieve_max_script_size = 1M

  # Расширения
  sieve_extensions = +notify +imapflags +vacation-seconds +editheader

  # ManageSieve
  sieve_max_actions = 32
  sieve_max_redirects = 4
}

Включаем ManageSieve в /etc/dovecot/conf.d/20-managesieve.conf:

service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
}
service managesieve {
  process_limit = 256
}
sudo systemctl restart dovecot

Синтаксис Sieve: основные конструкции

Sieve-скрипт состоит из директив require (подключение расширений) и правил if/elsif/else. Рассмотрим базовый синтаксис:

require ["fileinto", "reject", "vacation", "copy", "imap4flags"];

# Спам в папку Junk
if header :contains "X-Spam-Flag" "YES" {
    fileinto "Junk";
    stop;
}

# Письма от руководства — пометить как важные
if address :is :domain "from" "company.ru" {
    if address :is "from" "ceo@company.ru" {
        addflag "\\Flagged";
        fileinto "INBOX";
    }
}

# Рассылки в отдельную папку
if header :contains "List-Id" "" {
    fileinto "Lists";
    stop;
}

# Уведомления от мониторинга
if header :contains "from" "zabbix@" {
    fileinto "Monitoring";
    stop;
}

# Всё остальное — в INBOX (по умолчанию)
keep;

Операторы сравнения:

  • :is — точное совпадение
  • :contains — содержит подстроку
  • :matches — совпадение по шаблону (* и ?)
  • :regex — регулярное выражение (расширение)

Проверка и компиляция скриптов

Перед активацией скрипт необходимо проверить на синтаксические ошибки:

# Проверка синтаксиса
sievec /home/user/.dovecot.sieve

# Вывод подробной информации
sieve-test -t - -r recipient@company.ru /home/user/.dovecot.sieve test-email.eml

Утилита sieve-test позволяет протестировать скрипт на реальном письме без фактической доставки — незаменимый инструмент отладки.

Глобальные правила: антиспам и корпоративные политики

Глобальные скрипты в каталоге sieve_before выполняются до пользовательских — это позволяет администратору задавать обязательные правила.

Создаём глобальный антиспам-фильтр /etc/dovecot/sieve-before.d/spam.sieve:

require ["fileinto", "imap4flags", "reject"];

# SpamAssassin: высокий уровень спама — отклонить
if header :contains "X-Spam-Level" "**********" {
    discard;
    stop;
}

# SpamAssassin: средний уровень — в папку Junk
if header :contains "X-Spam-Flag" "YES" {
    fileinto "Junk";
    stop;
}

# Блокировка опасных вложений
if header :mime :type "Content-Type" "application" {
    if header :mime :subtype "Content-Type" ["exe", "bat", "cmd", "scr", "pif"] {
        reject "Письма с исполняемыми вложениями запрещены политикой безопасности.";
        stop;
    }
}

Компилируем глобальные скрипты:

sudo sievec /etc/dovecot/sieve-before.d/spam.sieve

Корпоративная политика автоархивации /etc/dovecot/sieve-after.d/archive.sieve:

require ["fileinto", "mailbox"];

# Письма старше определённого размера — в Archive
if size :over 10M {
    fileinto :create "Archive.Large";
    stop;
}

Автоответчик (vacation)

Расширение vacation реализует автоматический ответ — типичный сценарий «Я в отпуске». Sieve гарантирует, что один и тот же отправитель получит автоответ не чаще одного раза за указанный период.

require ["vacation", "vacation-seconds"];

vacation :days 1
    :subject "Автоответ: Иванов И.И. в отпуске"
    :from "ivanov@company.ru"
    :addresses ["ivanov@company.ru", "i.ivanov@company.ru"]
    "Здравствуйте!

С 1 по 15 апреля 2026 года я нахожусь в отпуске.
По срочным вопросам обращайтесь к Петрову С.А. (petrov@company.ru).

С уважением,
Иванов Иван Иванович";

Параметры:

  • :days 1 — отправлять повторный ответ тому же адресату не чаще раза в день
  • :addresses — список своих адресов (vacation отвечает только на письма, адресованные этим адресам)
  • :subject — тема ответного письма

Расширение vacation-seconds позволяет задавать интервал в секундах вместо дней — полезно для автоматических уведомлений.

ManageSieve: управление правилами из почтового клиента

Протокол ManageSieve (порт 4190) позволяет пользователям управлять своими Sieve-скриптами из почтового клиента без доступа к серверу по SSH.

Поддержка ManageSieve в почтовых клиентах:

  • Thunderbird — расширение Sieve (аддон)
  • Roundcube — плагин managesieve (встроен)
  • Horde — нативная поддержка
  • K-9 Mail (Android) — через сторонние приложения

Для Roundcube активация плагина:

# /etc/roundcube/config.inc.php
$config['plugins'] = array('managesieve');

# /etc/roundcube/plugins/managesieve/config.inc.php
$config['managesieve_host'] = 'localhost';
$config['managesieve_port'] = 4190;
$config['managesieve_usetls'] = true;
$config['managesieve_default'] = '/etc/dovecot/sieve-default.sieve';

Проверка работы ManageSieve через CLI:

# Подключение к ManageSieve
sieve-connect --server mail.company.ru --port 4190 --user ivanov

# Список скриптов
> listscripts
"main" ACTIVE
"vacation"

# Активация скрипта
> setactive "vacation"

Продвинутые сценарии фильтрации

Sieve поддерживает расширения, значительно расширяющие возможности фильтрации.

Фильтрация по дате и времени (date extension):

require ["date", "relational", "fileinto"];

# Письма, полученные в выходные — в папку Weekend
if currentdate :is "weekday" ["0", "6"] {
    fileinto "Weekend";
}

# Ночные уведомления — в отдельную папку
if currentdate :value "ge" "hour" "22" {
    fileinto "Night-Alerts";
}
if currentdate :value "le" "hour" "6" {
    fileinto "Night-Alerts";
}

Перенаправление с сохранением копии:

require ["copy", "fileinto"];

# Копия всех писем от клиентов — руководителю
if address :domain "from" "client-company.ru" {
    redirect :copy "manager@company.ru";
    fileinto "Clients";
}

Уведомления (notify extension):

require ["enotify", "variables"];

if header :contains "X-Priority" "1" {
    set "subject" "Срочное письмо от ${from}";
    notify :message "${subject}"
        "mailto:admin-phone@sms-gateway.ru";
}

Часто задаваемые вопросы

По умолчанию в домашнем каталоге пользователя: ~/.dovecot.sieve (активный скрипт) и ~/sieve/ (все скрипты). Путь настраивается параметром sieve в 90-sieve.conf. Скомпилированные версии (.svbin) создаются автоматически при первой доставке.

Используйте утилиту sieve-test для тестирования скрипта на сохранённом письме. Также проверяйте лог Dovecot: grep sieve /var/log/mail.log. Убедитесь, что плагин sieve подключён в протоколе lmtp/lda и скрипт скомпилирован без ошибок (sievec).

Да, в конфигурации Sieve можно ограничить доступные расширения: sieve_extensions = -redirect уберёт возможность перенаправления. Также параметр sieve_max_redirects = 0 запретит redirect, сохранив остальные действия.

Поместите скрипт в каталог sieve_before (выполняется до пользовательских правил) или sieve_after (после). Скрипты в sieve_before могут содержать stop; — тогда пользовательские правила не выполнятся. Не забудьте скомпилировать скрипт командой sievec.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#Dovecot Sieve#фильтрация почты#серверные правила#ManageSieve#почтовый сервер#сортировка почты#автоответчик#Dovecot
Комментарии 0

Оставить комментарий

загрузка...