Чужой опыт экономит время и увеличивает шансы для удачи

Dovecot 2 - Sieve

Вольный перевод официальной документации по Sieve в Dovecot 2. В одной заметке собраны разные части документации, которые могут быть наиболее полезны, + отсебятина. Значения параметров в конфигурационных файлах, механизм работы скриптов, скриптовые цепочки и пр.

ВАЖНО! Эта страница является частью списка заметок о настройке почтовой системы (Postfix+Dovecot и пр.).
Родительская страница - обязательна к просмотру: Установка и настройка почтового сервера

Подробнее о конфигурации к которой относятся примеры в этой статье - см. ссылку выше.
Тем же - коротко об основных терминах (MTA, MDA, MUA и т.п.).

Эта заметка имеет характер исследования. Все упомянутые в заметке эксперименты проводились на ОС Debian. Пожалуйста не используйте слепое копирование примеров. Автор не гарантирует, что применение изложенной здесь информации не приведет к потере данных.


Это скорее конспект-шпаргалка, чем достоверный справочник. Кроме ответов здесь могут присутствовать вопросы.

Содержание

  1. Важные замечания
  2. Описание конфигурации
  3. ManageSieve сервер
  4. Использование Pigeonhole Sieve
  5. Плагины Pigeonhole Sieve
  6. Расширения Pigeonhole Sieve
  7. Источники
В заметке часть информации рассматривается в контексте конкретной почтовой связки: Postfix+Dovecot на Debian

Важные замечания

  1. Dovecot-sieve обрабатывает только входящую почту (срабатывает на событие доставки почты Dovecot-LDA или lmtp). Поэтому манипуляции с почтой, производимые, например IMAP, не подвергаются обработке. После того как почта доставлена (после явного или неявного "stop"), Sieve теряет всякий контроль над ней. Впрочем, можно заставить Sieve обработать всю почту в определенной папке с помощью инструмента командной строки sieve-filter, например перехватив событие файловой системы с помощью Incron. См. ниже Использование sieve-filter на примере сравнения заголовков.

  2. Под ящиком здесь подразумевается корневой почтовый каталог пользователя, включающий все вложенные папки. Каталоги/папки пользователя расположены в пределах почтового ящика.

  3. Много интересной информации как обычно, - в документации, доступной после установки, например:

    /usr/share/doc/dovecot-core/dovecot/sieve/script-location-dict.txt.gz

    /usr/share/doc/dovecot-core/dovecot/wiki/Pigeonhole.*

    /usr/share/doc/dovecot-core/dovecot/wiki/Pigeonhole.Sieve.Examples.txt.gz

Описание конфигурации

Базовая конфигурация

Чтобы использовать Sieve, необходимо убедиться, что за доставку почты в ящики пользователей отвечает LDA или LMTP. Необходимо также включить плагин Pigeonhole Sieve в файлах конфигурации 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 принимает следующие опции конфигурации в секции plugin конфигурационного файла (по возможности указаны значения по умолчанию):

sieve = ~/.dovecot.sieve
Путь к основному скрипту Sieve каждого пользователя. Если используется ManageSieve сервер, то это должно быть имя символической ссылки на активный скрипт, которая находится в каталоге sieve_dir (см. ниже). Необходимо избегать прямого указания на сам скрипт, и избегать его непосредственного размещения внутри каталога sieve_dir.


sieve_default = (для версий 0.3+)
Расположение файла персонального sieve-скрипта по умолчанию, который запрашивается только если персональный пользовательский скрипт не найден (напр: /var/lib/dovecot/default.sieve ). См. раздел Выполнение нескольких скриптов последовательно для инструкций по запуску глобального Sieve-скрипта перед и после использования персонального скрипта. Как правило здесь указан глобальный скрипт, поэтому необходимо указанный скрипт подвергнуть пре-компиляции с использованием инструмента sievec командной строки (см. раздел Использование sievec для компиляции Sieve скриптов).


sieve_global_path =
Устаревший вариант "sieve_default" (для версий Pigeonhole 0.2 и ранее).


sieve_global_dir =
Каталог глобальных скриптов для вложенных расширений. Интерпретатор Sieve принимает только файлы с расширением ".sieve", так что вложенные расширения ожидаются в файлах в каталоге "sieve_global_dir", например для name.sieve :

require "include";
include :global "name";

sieve_dir = ~/
Каталог персональных скриптов для вложенных расширений. Интерпретатор Sieve принимает только файлы с расширением ".sieve", так что вложенные расширения ожидаются в файлах в каталоге "sieve_dir", например для name.sieve :

require "include";
include :personal "name";

Если используется ManageSieve сервер, то этот каталог так же хранит загружаемые скрипты.


sieve_extensions =
Указывает какие расширения языка Sieve доступны пользователям.
Доступны следующие расширения (за исключением устаревших):

  • расширения позволяющие изменять сообщения
  • расширения требующие явного конфигурирования
  • расширения находящиеся в стадии разработки

Системный администратор может выключить стандартные расширения, а так же включить расширения не предусмотренные по умолчанию. Все поддерживаемые расширения см. в разделе Расширения Pigeonhole Sieve. Как правило, все расширения должны быть перечислены в этом параметре, но с версии Sieve 0.1.7 добавлена возможность использовать "+" и "-" для включения/отключения расширений по умолчанию. Например sieve_extensions = +imapflags включит устаревшее расширение "imapflags" в дополнение ко всем включенным расширениям по умолчанию.


sieve_global_extensions = (для версий 0.3+)
Расширения языка Sieve, включенные только для глобальных скриптов. Это может быть задействовано, для ограничения использования стандартных расширений в административном контроле, в случаях, когда эти расширения могут вызвать проблемы с безопасностью. Эта настройка имеет более высокий приоритет, чем sieve_extensions = (см. выше), и включенные в ней расширения никогда не будут доступны в пользовательских скриптах, независимо от того, что указано для настройки sieve_extensions.

Синтаксис этой настройки такой же, как у sieve_extensions, но в настоящее время невозможно помечать расширения используемые/отключенные по отношению к списку по умолчанию.


sieve_plugins =
Pigeonhole Sieve интерпретатор может быть владельцем собственных плагинов. В этом параметре могут быть указаны такие плагины. См. список доступных в разделе Плагины Pigeonhole Sieve.


sieve_user_log =
Путь к файлу пользовательского лога. По умолчанию (если не указано) - используется. Имя файла лога определяется настройкой sieve.
Если в ней указан основной пользовательский файл, то лог будет записан в <filename>.log по умолчанию. Если в ней не указан файл, то лог-файл для юзера по умолчанию будет ~/.dovecot.sieve.log .


recipient_delimiter = +
Разделитель, который ожидается между именем пользователя :user и :detail в части адреса, представленной расширением subaddress. Он может быть так же последовательностью символов (напр "--"). Текущая реализация ищет разделитель начиная слева до первого вхождения. После того как разделитель будет найден, та часть что слева от него считается именем пользователя :user, а часть, что справа - :detail. Этот параметр также используется в Dovecot-LMTP с идентичной семантикой.


Пример применения настроек:

plugin {
...
   # Местоположение активного пользовательского скрипта:
   sieve = ~/.dovecot.sieve
   # Если пользователь имеет не персональный активный скрипт 
   # (если параметр sieve= не представлен) , используется следующее:
   sieve_global_path = /var/lib/dovecot/sieve/default.sieve
   # Вложенное расширение извлекает скрипт :personal из этого каталога.
   # Когда ManageSieve используется это также тот каталог, где загружается скрипт.
   sieve_dir = ~/sieve
   # Вложенное расширение извлекает :global из этого каталога:
   sieve_global_dir = /var/lib/dovecot/sieve/global/
}

Конфигурируемые лимиты

sieve_max_script_size = 1M
Максимальный размер Sieve-скрипта. Компилятор отбросит любое скрипты больше указанного лимита. Если указать "0" - лимит неограничен.


sieve_max_actions = 32
Максимальное количество действий при выполнении одного скрипта. Если указать "0" - лимит неограничен.


sieve_max_redirects = 4
Максимальное количество редиректов, которое может быть выполнено при выполнении одного скрипта. Если указать "0", то в зависимости от версии: для версии "0.3.0+" редиректы вообще будут запрещены, а для более старых версий - количество редиректов будет неограниченным (в этом случае нужно соблюдать осторожность).


Размещение скриптов

Только для версий Pigeonhole 0.3.1+

Размещение скриптов не ограничивается файловой системой. Интерпретатор Sieve может быть расширен для получения скриптов из других источников, например из баз данных. В настоящее время, все параметры, которые используются для указания месторасположения скрипта Sieve, такие как sieve= , sieve_default= , sieve_dir= , sieve_global_dir= , допускают использование следующего синтаксиса:

location = [<type>:]path[;<option>[=<value>][;...]]

По умолчанию реализованы следующие типы <option> :

file - Путь к файлу или папке файловой системы, содержащей файлы скриптов в формате <script-name>.sieve

dict - Указание для Dovecot-dict. Месторасположение "dict uri". Если префикс пропущен, то этот параметр принимает тип расположения "file".


Следующие параметры определены для всех типов location :

name=<script-name> - Указать имя Sieve-скрипта. Этот параметр требуется, если имя Sieve-скрипта не содержится в path (а например для dict должен быть указан конкретный скрипт). И несмотря на то, что в path будет указано имя скрипта, <option> переопределяет его. Если же имя указано явно в запросах (например для вложенного скрипта из sieve_dir= location ), то эта опция не имеет эффекта.

bindir=<dirpath> - Каталог, - место хранения скомпилированных бинарников. Если этот параметр пропущен, то он определяется параметром <type> . Для типа file, хранилище бинарников предполагается в том же каталоге, где и скрипт-файл, если это возможно. Для типа dict хранилище бинарников вообще не предполагается. Не стоит задавать один каталог для скриптов у которых разное месторасположение, т.к. это может привести к непредсказуемым последствиям.

Специфические расширения, требующие конфигурирования

Расширения языка Sieve, требующие конфигурирования:

  • vacation и vacation-seconds - см. ниже
  • spamtest и virustest (конфигурирование обязательно) - см. ниже здесь и здесь
  • и пр.

Месторасположение пользовательских Sieve-скриптов

По умолчанию плагин Dovecot-Sieve ищет пользовательский файл скрипта в домашнем каталоге пользователя ( ~/.dovecot.sieve ). Поэтому домашний каталог пользователя должен присутствовать.

Если необходимо сохранить скрипт в другом месте, то можно переопределить умолчание, используя параметр sieve , который указывает путь к файлу скрипта пользователя. Это можно сделать двумя способами:

  • Указать соответствующие параметры в конфигурационном файле Dovecot (по-видимому в /etc/dovecot/conf.d/90-sieve.conf )
  • Использовать экстра-поля при запросе данных пользователя через "user_query" (и наверное те же поля, с префиксом "userdb_"" при запросе через "password_query" с использованием "prefetch" в "user_query";
    См. также заметку - Dovecot 2 - описание настройки, в контексте рассматриваемой конфигурации)

Пример подключения пользовательского Sieve-скрипта <username>.sieve в каталоге /var/sieve-scripts :

plugin {
...
 sieve = /var/sieve-scripts/%u.sieve
}

Можно использовать шаблоны подстановки "%u", как это показано в примере. Список всех переменных перечислен в заметке, указанной чуть выше. Относительный путь (или просто имя файла) будет интерпретироваться, как путь к домашнему каталогу пользователя + указанное значение.

Выполнение нескольких скриптов последовательно

Dovecot-Sieve позволяет выполнять несколько скриптов последовательно. Дополнительные скрипты могут быть выполнены до и после пользовательского скрипта. Например, можно выполнить скрипт глобальной политики до пользовательского скрипта. При этом невозможно использовать sieve_global_path (в новых версиях: sieve_default), потому, что этот параметр используется только когда пользовательские скрипты отсутствуют.

За расширение последовательных скриптов отвечают следующие параметры в секции "plugin{...}" соответствующего конфигурационного файла Dovecot:

sieve_before =
Путь к файлу скрипта или каталог, содержащий файлы скриптов, которые должны быть выполнены до выполнения пользовательского скрипта. Если путь указывает на каталог, то выполняются все Sieve-скрипты содержащиеся в нем (с надлежащими ".sieve" расширением). Порядок выполнения скриптов определяется сортировкой файлов по именам, с учетом 8-битного посимвольного сравнения.

sieve_after =
Действует аналогично sieve_before, но указанные скрипты выполняются после пользовательского скрипта (только если выполнение последовательности не было прервано!).

В скриптах могут быть некоторые команды, которые могут привести к прерыванию последовательности выполнения скриптов друг за другом. Команда "keep" должна быть явно или неявно задействована, иначе следующий скрипт не станет выполняться. Например, после выполнения в каком либо скрипте "discard; stop;", отменяющем сохранение, "keep" будет считаться сброшенной и последовательность прерывается. При этом "keep" по разному себя проявляет в разном контексте. Например, в обычной ситуации "keep" эквивалентно " fileinto "INBOX"; ", потому что "keep" в итоге также приводит к сохранению сообщения. А в последовательном выполнении "keep" не приводит к сохранению, а означает только возможность передать эстафету следующему скрипту. Явное сохранение письма в папку не должно осуществляться в процессе выполнения последовательности. Чтобы все-же сделать это, нужно использовать "fileinto" с " :copy " или вместе с " keep; ".

Все действия в каждом скрипте (кроме "keep") должны сработать до передачи эстафеты следующему скрипту. Это означает, что если какой-либо скрипт столкнется с ошибкой, команды ранее выполненных скриптов не будут отменены, но последовательность выполнения скриптов прервется. Вместо этого неявно выполнится "keep".

Так же как и при использовании обычного одиночного скрипта, в цепочке скриптов, Dovecot-Sieve заботится о том, чтобы не выполнять дублирующихся доставок, пересылок, или ответов. Когда действие "vacation" (автоответчик) выполняется несколько раз в разных скриптах, срабатывание стандартной ошибки не происходит, - все дублирующие действия "vacation" просто отменяются.

Пример конфигурационного файла /etc/dovecot/conf.d/90-sieve.conf

plugin {
...
   # Скрипт выполняемый перед пользовательским скриптом.
   # Напр. управление маркированием сообщения как опасного:
   sieve_before = /var/lib/dovecot/sieve/discard-virusses.sieve
   # Скрипт выполняемый после пользовательского скрипта.
   # Напр. правила систематизации почты по умолчанию.
   sieve_after = /var/lib/dovecot/sieve/after.d/
}

ВАЖНО! Нужно убедится, что все скрипты sieve_before и sieve_after были предварительно откомпилированы с использованием инструмента командной строки sievec (см. раздел Использование sievec для компиляции Sieve скриптов).

Sieve и LMTP

В Dovecot 2 была добавлена поддержка LMTP. Так же как и в Dovecot-LDA, в нем можно воспользоваться поддержкой Pigeonhole Sieve. Поскольку у LMTP есть секция настройки protocol lmtp{...} (в отдельном конфигурационном файле), необходимо добавить подключение плагина Sieve в параметре mail_plugins.

Например для файла /etc/dovecot/conf.d/20-lmtp.conf :

plugin {
...
  mail_plugins = $mail_plugins sieve
}

ManageSieve сервер

ManageSieve-сервер - это возможность пользователям создавать свои правила для входящей почты. Если он запущен и доступен для использования в MUA, то каждый пользователь может загружать на сервер персональные почтовые фильтры (свои собственные Sieve-скрипты), - без необходимости доступа к shell или FTP, а также создавать их используя например web-интерфейс почтового клиента.

Поддержка осуществляется "Pigeonhole project". Он доступен как отдельный Dovecot сервис.

Здесь официальная документация была мною кое-где подкорректирована, т.к. установившиеся с пакетом из репозитариев файлы конфигурации отличались от описания Dovecot-wiki.

Установка ManageSieve

Установка в Debian тривиальна:

# apt-get install dovecot-managesieved
И конечно должен быть уже установлен пакет dovecot-sieve. В последних релизах Debian оба пакета включены в состав пакета dovecot-common.

ВАЖНО! Если Sieve-плагин использовался ранее без ManageSieve, и в системе есть уже работающие скрипты, - категорически рекомендуется сделать их полную резервную копию перед установкой. ManageSieve перемещает эти файлы, заменяя их символической ссылкой, но эта операция не достаточно протестирована.

Настройка конфигурации сводится к настройке протокола ManageSieve и настройке Sieve-интерпретатора. Установки Sieve-интерпретатора действуют одновременно для Dovecot-LDA и lmtp.

Ниже изложены настройки ManageSieve-протокола и соответствующие настройки SIeve.

Настройки конфигурации протокола ManageSieve

Конфигурирование сводится к настройке Sieve для протоколов, настройке плагина Sieve, настройке сервиса managesieve и протокола sieve.

Все необходимые файлы устанавливаются сразу при установке, включая бинарники для managesieve и managesieve-login. Единственное, что нужно сделать для активации поддержки протокола ManageSieve в Dovecot, - это добавить поддержку sieve-протокола в соответствующий параметр конфигурации: protocols = . Это может быть что-то вроде:

/etc/dovecot/dovecot.conf

...

#!include_try /usr/share/dovecot/protocols.d/*.protocol

protocols = imap lmtp sieve

...

Закомментированная строка содержит путь к папке, где после установки ManageSieve должен появиться файл наподобие managesieved.protocol. Но наверное все-же лучше указывать подключение протоколов вручную чем используя инклуд каталога, т.к. не все установленные протоколы могут быть нужны.

ВАЖНО! В новых версиях Dovecot в параметре protocols = нужно использовать sieve вместо managesieve.

После подключения protocols = ... sieve и перезагрузки Dovecot - # service dovecot restart , стартует демон managesieve, который по умолчанию будет прослушивать порт 4190

# sockstat -l

...

root     dovecot   ...   tcp4   *:4190            *:*     LISTEN

root     dovecot   ...   tcp4   127.0.0.1:143     *:*     LISTEN

...

Уже на этом этапе, например в web-интерфейсе Roundcube, при включенном плагине "managesieve" во вкладке "Фильтры" в настройках появится доступ к серверу ManageSieve.

КСТАТИ! В репозитариях Debian доступен пакет: php-net-sieve. Еще один пакет - libnet-sieve-script-perl, дает возможность читать, анализировать и записывать Sieve-файл сценария, организуя доступ к правилам, действиям и условиям объектов.

В файле /etc/dovecot/conf.d/20-managesieve.conf , в секции protocol sieve {...} , могут быть указаны следующие настройки:

managesieve_max_line_length = 65536
Максимальная длина командной строки ManageSieve в байтах. Этот параметр зависит от настроек IMAP. Вряд ли строка будет слишком длинной, поэтому изменять указанное значение наверное не стоит.


managesieve_logout_format = bytes=%i/%o
Задает шаблон строки, используемый в сессии для аутентификации, где:
%i - общее количество байт читаемых из клиента
%o - общее количество байт передаваемых клиенту.


managesieve_implementation_string = Dovecot Pigeonhole
Можно обмануть клиента при подключении к сервису, посылая ему подложное сообщение (например: "Cyrus timsieved v2.2.13").


managesieve_max_compile_errors = 5
Максимальное количество ошибок компиляции, возвращаемых клиенту после загрузки скрипта или его верификации.


managesieve_sieve_capability =, managesieve_notify_capability =
Соответственно - сообщение о SIEVE и NOTIFY возможностях сервисом ManageSieve до аутентификации. Если эти параметры не указаны, они будут назначаться динамически согласно тому, что Sieve поддерживает по умолчанию (после авторизации это может меняться в зависимости от пользователя).


Настройки конфигурации Sieve для ManageSieve

Та часть настроек Sieve, которая имеет отношение к ManageSieve в основном сводится к двум параметрам. Необходимо указать, где должны хранится пользовательские скрипты, и где находится активный скрипт. Это настраивается в секции plugin{...} , в файле /etc/dovecot/conf.d/90-sieve.conf .

sieve_dir = ~/sieve
см. также выше
Каталог персональных скриптов. Считываются только файлы с расширением ".sieve" (остальные игнорируются). Sieve также использует этот параметр, чтобы найти пользовательские скрипты при использовании Sieve-расширений (дополнений). Указанное здесь место хранения скриптов будет создано автоматически, если оно не существует (если системные привилегии позволяют сделать это). Это будет аналогично поведению почтового демона при создании папок пользовательского ящика.


sieve = ~/.dovecot.sieve
см. также выше
Определяет местоположение (имя) символической ссылки на активный скрипт в каталоге хранилища Sieve sieve_dir. Sieve использует этот параметр, чтобы найти основной файл скрипта, который должен быть выполнен в момент доставки почты. При использовании ManageSieve, это должна быть символическая ссылка, которая управляется сервисом ManageSieve. ManageSieve определяет, какой скрипт (если таковые имеются) в каталоге sieve_dir выполняется для входящих сообщений. Если в указанном месте находился файл, который перенесется в каталог sieve_dir и будет переименован, например как "dovecot.orig.sieve", то он будет воспринят клиентом ManageSieve как "dovecot.orig".
Не разумно размещать ссылку внутри почтового ящика, так как она может быть ошибочно принята за почтовую папку. Внутри Maildir например, файл/ссылка по умолчанию ".dovecot.sieve" может выглядеть как фантомная папка "/dovecot/sieve" в дереве IMAP.


Квоты (лимиты) для ManageSieve

По умолчанию, пользователи могут управлять неограниченным количеством Sieve-скриптов на сервере через ManageSieve. Тем не менее, ManageSieve может быть настроен с применением ограничений на количество персональных Sieve-скриптов для каждого пользователя и/или объем дискового хранилища, используемого этими скриптами. Максимальный размер отдельных скриптов определяется основной конфигурацией Sieve. Лимиты настраиваются в секции plugin{...} , в файле /etc/dovecot/conf.d/90-sieve.conf . См. Конфигурируемые лимиты.

Пример настроек для ManageSieve

Файл /etc/dovecot/conf.d/20-lmtp.conf :

protocol lmtp {
  #postmaster_address = postmaster@domain.tld
  mail_plugins = $mail_plugins sieve
  #info_log_path = /var/log/dovecot-lmtp.log
}

Файл /etc/dovecot/conf.d/90-sieve.conf :

plugin {
...
  # Used by both the Sieve plugin and the ManageSieve protocol
  sieve = ~/.dovecot.sieve
  sieve_dir = ~/sieve
}

Файл /etc/dovecot/conf.d/20-managesieve.conf :

...
service managesieve-login {
  #inet_listener sieve {
  #  port = 4190
  #}
 
  #inet_listener sieve_deprecated {
  #  port = 2000
  #}
 
  # Number of connections to handle before starting a new process. Typically
  # the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0
  # is faster. <doc/wiki/LoginProcess.txt>
  #service_count = 1
 
  # Number of processes to always keep waiting for more connections.
  #process_min_avail = 0
 
  # If you set service_count=0, you probably need to grow this.
  #vsz_limit = 64M
}
 
service managesieve {
  # Max. number of ManageSieve processes (connections)
  #process_limit = 1024
}
# Service configuration
 
protocol sieve {
  # Maximum ManageSieve command line length in bytes. ManageSieve usually does
  # not involve overly long command lines, so this setting will not normally need
  # adjustment
  #managesieve_max_line_length = 65536
 
  # Maximum number of ManageSieve connections allowed for a user from each IP address.
  # NOTE: The username is compared case-sensitively.
  #mail_max_userip_connections = 10
 
  # Space separated list of plugins to load (none known to be useful so far). Do NOT
  # try to load IMAP plugins here.
  #mail_plugins =
 
  # MANAGESIEVE logout format string:
  #  %i - total number of bytes read from client
  #  %o - total number of bytes sent to client
  #managesieve_logout_format = bytes=%i/%o
 
  # To fool ManageSieve clients that are focused on CMU's timesieved you can specify
  # the IMPLEMENTATION capability that the dovecot reports to clients.
  # For example: 'Cyrus timsieved v2.2.13'
  #managesieve_implementation_string = Dovecot Pigeonhole
 
  # Explicitly specify the SIEVE and NOTIFY capability reported by the server before
  # login. If left unassigned these will be reported dynamically according to what
  # the Sieve interpreter supports by default (after login this may differ depending
  # on the user).
  #managesieve_sieve_capability =
  #managesieve_notify_capability =
 
  # The maximum number of compile errors that are returned to the client upon script
  # upload or script verification.
  #managesieve_max_compile_errors = 5
 
  # Refer to 90-sieve.conf for script quota configuration and configuration of
  # Sieve execution limits.
}
Пример скопирован из официальной документации. В рассматриваемой конфигурации это выглядят по-другому!

См. заметку Полный пример установки всех пакетов и настройки конфигурационных файлов.


Использование Pigeonhole Sieve

Pigeonhole Sieve - это проект, который реализует поддержку языка Sieve в Dovecot (включая настройку скриптов пользователями).

Имена каталогов

Необходимо указывать имена почтовых каталогов в таком виде, в котором их видят клиенты IMAP. Например доставка почты в каталог "Customers", который является вложенным в каталог "Work" может выглядеть так:

Для namespace с prefix="", separator=. (Maildir по умолчанию):

require "fileinto";
fileinto "Work.Customers";

Для namespace с prefix=INBOX., separator=. (Courier по умолчанию):

require "fileinto";
fileinto "INBOX.Work.Customers";

Для namespace с prefix="", separator=/ (mbox, dbox по умолчанию):

require "fileinto";
fileinto "Work/Customers";

Sieve использует кодировку UTF8 для имен почтовых каталогов, а IMAP использует модифицированный UTF7. Это означает, что не-ASCII символы, содержащиеся в имени почтового каталога, в IMAP и SIeve-скриптах будут представлены по-разному.

Включение скрипта в скрипт (include)

Если в скрипте встречается include:

require ["include"];
include :global "global-spam";
include :personal "my-own-spam";

то скрипт с указанным именем (в скрипте нельзя использовать разделитель "/"), ищется в соответствующем каталоге, указанном в настройках

/etc/dovecot/conf.d/90-sieve.conf :

plugin {
  # Directory for :personal include scripts. The default is to use home directory.
  sieve_dir = %h/sieve
  # Directory for :global include scripts (not to be confused with sieve_global_path).
  # If unset, the include fails.
  sieve_global_dir = /etc/dovecot/sieve/
}

При этом скрипт include :global "global-spam"; должен находится в каталоге sieve_global_dir = /etc/dovecot/sieve/,

а скрипт include :personal "my-own-spam" в каталоге sieve_dir = %h/sieve.

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

См. заметку - обзор разных механизмов реализации автоответчиков.

vacation (расширение Pingeonhole Sieve) оперирует с sender (отправитель) и recipient (получатель). Они берутся из:

  • Для sender: из -f параметра Dovecot-LDA, либо из Return-Path: заголовка сообщения
  • Для recipient: из -a параметра Dovecot-LDA, либо из -d параметра Dovecot-LDA. Если этого не дано (доставка системных пользователей), то используется переменная среды окружения $USER

  • Vacation автоматически отвечает отправителю сообщения.
    Список отправителей, для которых срабатывает автоответчик Vacation, хранится в файле .dovecot.lda-dupes в домашнем каталоге (корневом каталоге почтового ящика) пользователя. Во время тестирования Vacation, легко забыть что ответ отправляется только один раз в заданном промежутке дней. Если возникают проблемы с получением ответа, стоит попробовать удалить этот файл. Если это не помогло, то необходимо убедится, что проблема не связана с отправкой почты в целом из за выполнения команды "reject" Sieve.

    Автоматические ответы не отправляются в любом из следующих случаев:

    • sender не определен(<>)
    • sender и recipient одинаковы
    • sender недавно (в пределах :days дней, по умолчанию 7) уже получил ответ той-же vacation-команды
    • Сообщение содержит по крайней мере один из элементов заголовка списка рассылки: "list-id", "list-owner", "list-subscribe", "list-post", "list-unsubscribe", "list-help", или "list-archive"
    • Заголовок "Auto-Submitted:" содержит "no"
    • Заголовок "Precedence:" содержит значение "junk", "bulk" или "list"
    • sender считается системным, если:
      • начинается с "MAILER-DAEMON" (без учета регистра)
      • начинается с "LISTSERV" (без учета регистра)
      • начинается с "majordomo" (без учета регистра)
      • содержит строку "-request" в любом месте в (с учетом регистра), или
      • начинается с "owner-" (без учета регистра)
    • recipient и альтернативный тег, относящийся к команде ":addresses", не найден в сообщении, в полях: "To:", "Cc:", "Bcc:", "Resent-To:", "Resent-Cc:" или "Resent-Bcc:"

    Обратный адрес в письме, отправленном самим автоответчиком, выглядит как "Return-Path: <>", и "From: ... address@domain.tld" где address@domain.tld берется из параметра настройки postmaster_address = address@domain.tld используемого агента доставки (для lmtp этот параметр указывается в файле /etc/dovecot/conf.d/20-lmtp.conf , в секции protocol lmtp {...} )

    Конфигурирование расширения vacation

    Расширение vacation доступно по умолчанию. В отличие от него, расширение vacation-seconds должно быть включено явно, добавлением его в sieve_extensions.

    Расширения vacation и vacation-seconds имеют свои специфические настройки. Параметры, определяющие период указываются со спецификатором s (секунды), если не указаны d (дни), h (часы) или m (минуты).

    Следующие настройки могут быть сконфигурированы для расширения vacation в /etc/dovecot/conf.d/90-sieve.conf плагине в секции plugin {...} (указаны значения по умолчанию):

    sieve_vacation_min_period = 1d
    Этот параметр указывает минимальный период, который может быть указан для тегов :days и :seconds. Минимум "0" - означает, что пользователи могут указывать отправление сообщения автоответчика для каждого входящего сообщения, которое удовлетворяет другим критериям ответа (см. RFC 5230). Нулевое значение, однако, не рекомендуется.

    sieve_vacation_max_period = 0
    Этот параметр определяет максимальный период, который может быть указан для тега :days. Заданное значение должно быть больше, чем sieve_vacation_min_period. Значение "0" означает, что верхнего предела нет.

    sieve_vacation_default_period = 7d
    Этот параметр определяет соответствующий период, который используется, когда теги :days и :seconds не указаны. Заданное значение должно лежать между значениями sieve_vacation_min_period и sieve_vacation_max_period.

    При указании неправильных значений параметров Sieve выдает предупреждение и возвращается к значениям по умолчанию.

    Пример конфигурации:

    /etc/dovecot/conf.d/90-sieve.conf

    plugin {
      # Use vacation-seconds
      sieve_extensions = +vacation-seconds
     
      # One hour at minimum
      sieve_vacation_min_period = 1h
     
      # Ten days default
      sieve_vacation_default_period = 10d
     
      # Thirty days at maximum
      sieve_vacation_max_period = 30d
    }

    Пример скрипта vacation

    Автоответчик функционирует с использованием включенного по умолчанию расширения vacation. Следующий скрипт отвечает: "я за пределами офиса", если входящее письмо не является спамом:

    require ["fileinto", "vacation"];
    # Move spam to spam folder
    if header :contains "X-Spam-Flag" "YES" {
      fileinto "spam";
      # Stop here so that we do not reply on spams
      stop;
    }
    vacation
      # Reply at most once a day to a same sender
      :days 1
      :subject "Out of office reply"
      # List of additional recipient addresses which are included in the auto replying.
      # If a mail's recipient is not the envelope recipient and it's not on this list,
      # no vacation reply is sent for it.
      :addresses ["j.doe@company.dom", "john.doe@company.dom"]
    "I'm out of office, please contact Joan Doe instead.
    Best regards
    John Doe";

    Следующий скрипт позволяет вложить исходный заголовок в ответ, и использует расширение variables, которое также включено по умолчанию:

    require ["variables", "vacation"];
    # Store old Subject line so it can be used in vacation message
    if header :matches "Subject" "*" {
            set "subjwas" ": ${1}";
    }
    vacation
      :days 1
      :subject "Out of office reply${subjwas}"
      :addresses ["j.doe@company.dom", "john.doe@company.dom"]
    "I'm out of office, please contact Joan Doe instead.
    Best regards
    John Doe";

    Расширения spamtest и virustest

    Использование расширений spamtest и virustest (RFC 5235), обеспечивает командный интерфейс для обработки оценок спам- и вирусов-тестов.

    Расширения spamtest, spamtestplus и virustest не включены по умолчанию, следовательно, они должны быть включены явно в параметре sieve_extensions.

    Следующие параметры должны быть указаны в файле конфигурации для использования расширений spamtest и spamtestplus. Расширение virustest имеет идентичные параметры конфигурации, но с префиксом 'sieve_virustest_' вместо 'sieve_spamtest_':

    sieve_spamtest_status_type = "score" / "strlen" / "text"
    Этот параметр определяет тип статуса результата, произведенного спам/антивирусным сканером. Это может быть либо числом (score), строкой значимого количества одинаковых символов (strlen), например: «*******», или текстовым описанием (text), например: {{{Spam}}} или 'Not Spam'.

    sieve_spamtest_status_header = [ ":" ]
    Этот параметр указывает, что поле заголовка содержит информацию результата спам-сканера, - в нем может использоваться синтаксис содержимого заголовка. Если соответствующий заголовок не будет найден, команда будет "0".
    Это структурируемая настройка. Первая часть определяет имя поля заголовка. Опционально, POSIX регулярное выражение следует полю заголовка, отделенного двоеточием. Любой пробел непосредственно после двоеточия не является частью регулярного выражения. Если регулярное выражение опущено, принимается любое содержимое заголовка и используется полное значение заголовка. Если регулярное выражение используется, то в нем должно быть указано одно совпадение (в скобках), результата спам-сканера. Если заголовок не соответствует регулярному выражению или если для значения не будет найдено совпадение, результат будет "0".

    sieve_spamtest_max_value =
    Этот параметр определяет максимальное значение числового спам-рейтинга.

    sieve_spamtest_max_header = [ ":" ]
    Некоторые спам-сканеры включают максимальное значение в одном из их заголовков. Используя данный параметра, можно извлечь этот максимум из самого сообщения, вместо задания максимального значения вручную с помощью настройки sieve_spamtest_max_value описанной выше. Синтаксис идентичен параметру sieve_spamtext_status_header.

    sieve_spamtest_text_valueX =
    Когда параметр sieve_spamtest_status_type установлен ​​"text", эти параметры указывают, что spamtest примет значение "X", когда указанная строка заголовка (часть) совпала с определенным значением. Для spamtest и spamtestplus, допустимы значения "X" от 0 до 10, в то же время virustest использует значения только от 0 до 5.

    Пример конфигурации 1 (спам-заголовок X-Spam-Score: No, score=-3.2 )

    /etc/dovecot/conf.d/90-sieve.conf :

    plugin {
      sieve_extensions = +spamtest +spamtestplus
     
      sieve_spamtest_status_type = score
      sieve_spamtest_status_header = \
        X-Spam-Score: [[:alnum:]]+, score=(-?[[:digit:]]+\.[[:digit:]])
      sieve_spamtest_max_value = 5.0
    }

    Пример конфигурации 2 (спам-заголовок X-Spam-Status: Yes )

    /etc/dovecot/conf.d/90-sieve.conf :

    plugin {
      sieve_extensions = +spamtest +spamtestplus
     
      sieve_spamtest_status_type = text
      sieve_spamtest_status_header = X-Spam-Status
      sieve_spamtest_text_value1 = No
      sieve_spamtest_text_value10 = Yes
    }

    Пример конфигурации 3 (спам-заголовок X-Spam-Score: sssssss )

    /etc/dovecot/conf.d/90-sieve.conf :

    plugin {
      sieve_extensions = +spamtest +spamtestplus
     
      sieve_spamtest_status_header = X-Spam-Score
      sieve_spamtest_status_type = strlen
      sieve_spamtest_max_value = 5
    }

    Пример конфигурации 4
    спам-заголовок X-Spam-Score: status=3.2 required=5.0
    вирус-заголовок: X-Virus-Scan: Found to be clean.

    /etc/dovecot/conf.d/90-sieve.conf :

    plugin {
      sieve_extensions = +spamtest +spamtestplus +virustest
     
      sieve_spamtest_status_type = score
      sieve_spamtest_status_header = \
        X-Spam-Score: score=(-?[[:digit:]]+\.[[:digit:]]).*
      sieve_spamtest_max_header = \
       X-Spam-Score: score=-?[[:digit:]]+\.[[:digit:]] required=([[:digit:]]+\.[[:digit:]])
     
      sieve_virustest_status_type = text
      sieve_virustest_status_header = X-Virus-Scan: Found to be (.+)\.
      sieve_virustest_text_value1 = clean
      sieve_virustest_text_value5 = infected
    }

    Также см. ссылки ниже.

    Плагин sieve_pipe и расширение vnd.dovecot.pipe

    Плагин sieve_pipe добавляет расширение vnd.dovecot.pipe языка Sieve. Для установки плагина необходимо скачать исходники и скомпилировать. Компиляция происходит с использованием параметра --with-dovecot= , поэтому необходимо обратиться к официальной документации.

    См. ссылки ниже.

    Пример настройки через сокет с использованием параметра sieve_pipe_socket_dir =

    /etc/dovecot/conf.d/90-sieve.conf :

    plugin {
      sieve = ~/.dovecot.sieve
     
      sieve_plugins = sieve_pipe
     
      sieve_pipe_socket_dir = sieve-pipe
    }
     
    service sieve-custom-action {
      executable = script-pipe /usr/lib/dovecot/sieve-pipe/sieve-custom-action.sh
     
      # use some unprivileged user for execution
      user = dovenull
     
      # socket name is program-name in Sieve (without sieve-pipe/ prefix)
      unix_listener sieve-pipe/sieve-custom-action {
      }
    }

    Пример настройки прямого выполнения с использованием параметра sieve_pipe_bin_dir =

    /etc/dovecot/conf.d/90-sieve.conf :

    plugin {
      sieve = ~/.dovecot.sieve
     
      sieve_plugins = sieve_pipe
     
      # This directory contains the scripts that are available.
      sieve_pipe_bin_dir = /usr/lib/dovecot/sieve-pipe
    }

    Использование:

    require ["vnd.dovecot.pipe"];
    pipe "external-program";
    }

    Пример jabber notification notify.sieve :

    require [ "vnd.dovecot.pipe", "copy", "variables" ];
    if header :matches "subject" "*" { set "subject" "${1}"; }
    if header :matches "from" "*" { set "from" "${1}"; }
    pipe :args [ "USER@DOMAIN.TLD", "${from}", "${subject}" ] :copy :try "jabber_notify.sh" ;

    где jabber_notify.sh :

    USER="$1"
    FROM="$2"
    SUBJECT="$3"
    # clix accepts this as a config search directory
    # you can use clix - lua based
    # http://code.matthewwild.co.uk/clix/summary
    # or use any other jabber cmd line client that can send things
    export XDG_CONFIG_HOME=/srv/mail
    /srv/mail/clix.bin send -q --account=default --to="$USER" "New mail from ${FROM} about ${SUBJECT}" 
    # we don't care about the exit status in this case
    exit 0

    $XDG_CONFIG_HOME/.clixrc:

    [default]
    jid=USER@DOMAIN.TLD
    password=PASSWORD

    Расширение vnd.dovecot.duplicate

    Это расширение позволяет обнаруживать дубликаты писем по "Message-ID". По умолчанию оно отключено. Для его включения не нужны дополнительные плагины, - достаточно просто добавить его в sieve_extensions или sieve_global_extensions.

    В официальном описании указано, что дубликаты проверяются только у тех писем, которые ранее уже были просмотрены расширением. Из этого следует как минимум то, что если первое из дублирующихся писем будет помещено в ящик каким-нибудь другим способом, минуя расширение, то следующее письмо, даже будучи дубликатом, при обработке расширением дубликатом считаться не будет.
    А как максимум - судя по-всему, это расширение вообще даже не просматривает уже доставленные письма и не обращается к ящику пользователя, а имеет дело только с еще не доставленными письмами, в момент их доставки.

    ВАЖНО! Тестирование показало, что если в скрипте сначала идет fileinto "SubFolder"; , то применение после этого if duplicate { ... } , ни к чему не приводит - дубликаты не распознаются.
    Еще один эксперимент показал, что вставка в код даже пустого блока if duplicate { } приводит к появлению файла ".dovecot.lda-dupes" в корневом каталоге почтового ящика пользователя. Этот же файл, кстати, появляется при обработке писем расширением vacation, а также при использовании redirect (из того, что тестировал), что может приводить к неприятным накладкам.

    Настройка сводится к добавлению значения в параметр sieve_extensions.

    /etc/dovecot/conf.d/90-sieve.conf :

    plugin {
    ...
      sieve_before = /var/lib/dovecot/sieve/global/test.duplicate.sieve
    ...
      sieve_extensions = +vnd.dovecot.duplicate
    ...
      # sieve_global_extensions = +vnd.dovecot.duplicate
    ...
    }
    См. отличие sieve_extensions и sieve_global_extensions выше.

    Создадим сам скрипт, указанный выше в параметре sieve_before

    /var/lib/dovecot/sieve/global/test.duplicate.sieve :

    require ["vnd.dovecot.duplicate", "imap4flags", "fileinto"];
    # if duplicate :seconds 60 {
    if duplicate {
    #  setflag "\\seen";
      fileinto "Trash";
    }
    "Trash" - указывается без точки!

    ВАЖНО! На момент написания заметки, из репозитариев устновился пакет dovecot-sieve, в котором не поддерживался аргумент :seconds для расширения vnd.dovecot.duplicate (указывает интервал времени в котором искать дубликаты). Есть подозрение, что без него могут быть проблемы с нагрузкой (хотя разработчики предписывают в реализациях расширения накладывать ограничение, но реализовано ли это в Dovecot - неизвестно). См. закомментированную строку в примере выше: # if duplicate :seconds 60 { .
    На сайте разработчика (см. Источники), присутствует информация о том, что в этом расширении период указывается в файле /etc/dovecot/conf.d/90-sieve.conf в параметре sieve_duplicate_period, в виде числа с суффиксом: s (секунды), m (минуты), h (часы), d (дни). Но поддерживает ли эту функция последняя установка из репозитариев - неизвестно, нужна детальная проверка.
    Кроме того, на сайте разработчика, в последней версии расширения описано интересное свойство, - можно указывать имя для каждого блока кода, например: # if duplicate "name_one" { , ..., # if duplicate "name_other" { , и по-видимому использовать разную проверку дубликатов, в разных участках кода. Компилятор на этот аргумент реагирует спокойно (в отличие от :seconds), т.е. судя по-всему это работает (не проверял).

    Тестирование

    Самый простой способ протестировать этот скрипт - временно указать в Postfix отсылку себе на ящик авто-BCC.

    Временно добавим в Postfix отсылку авто-BCC для одного тестового получателя ему же в ящик

    /etc/postfix/main.cf :

    ...
    recipient_bcc_maps = hash:/etc/postfix/test_bcc
    ...

    Создадим, на время тестирования, таблицу (здесь "user@domain.tld" необходимо заменить на реальный адрес)

    /etc/postfix/test_bcc :

    user@domain.tld  user@domain.tld

    В консоли:

    # postmap /etc/postfix/test_bcc
    # service postfix reload

    Теперь можно послать самому себе письмо, и убедиться, что копия-дубликат попала в "Trash".
    Можно в указанном выше примере скрипта также раскомментировать # setflag "\\seen"; , и убедится, что письма-дубликаты перемещенные в папку "Trash", будут помечены как уже просмотренные.

    Не забываем вернуть Postfix в исходное состояние.
    Удаляем параметр recipient_bcc_maps из файла /etc/postfix/main.cf .
    А также удалим тестовые таблицы:

    # rm -v /etc/postfix/test_bcc
    # rm -v /etc/postfix/test_bcc.db
    # service postfix reload

    Использование sieve-filter на примере сравнения заголовков

    Dovecot-sieve имеет полезные инструменты командной строки: sieve-filter, sieve-test и sieve-dump. Много интересного можно узнать о них примерно так :)

    # man sieve-filter
    # man sieve-test
    # man sieve-dump

    На мой взгляд, наиболее интересный из них - sieve-filter. Он позволяет не только тестировать скрипты через командную строку, но и запускать их с реальными изменениями. Благодаря этому, можно заставить Dovecot-sieve реагировать не только на событие входящей почты, но и, например - на события файловой системы или др. В документации сказано, что этот инструмент экспериментальный, но многие его уже используют.

    Когда я тестировал его, то мне так и не удалось заставить работать с его помощью скрипт из предыдущего раздела (для расширения vnd.dovecot.duplicate), - скрипт отрабатывал вхолостую. Судя по-всему, это связано с особенностями работы этого расширения.

    Можно использовать sieve-filter не только для ручного тестирования, но и, например через Incrontab.
    Incrontab (incron) - работает подобно Cron, но инициируется не по времени, как Cron, а событиями файловой системы, что позволяет, например, отслеживать заданную папку и запускать скрипт по событиями в ней (например при создании файла, удалении, перемещении и т.п.). И кстати, в скрипт можно передать имя файла, с которым произошло событие, в подконтрольной папке.

    ВАЖНО! sieve-filter обрабатывает целевую папку полностью, - все письма в ней.

    Рассмотрим пример использования sieve-filter для скрипта, сравнивающего два разных заголовка в одном письме.
    Никакие специальные дополнительные настройки в файле /etc/dovecot/conf.d/90-sieve.conf здесь не нужны - подойдут стандартные. Просто добавим наш тестовый скрипт

    /etc/dovecot/conf.d/90-sieve.conf :

    ...
      sieve_before = /var/lib/dovecot/sieve/global/test.sieve
    ...

    Создадим скрипт

    /var/lib/dovecot/sieve/global/test.sieve :

    require ["variables"];
    if header :matches "Delivered-To" "*" {
      set "name" "${1}";
      if header :matches "Return-Path" "${name}" {
        discard;
        stop;
      }
    }

    Компилируем скрипт (про sievec см. ниже):
    # sievec /var/lib/dovecot/sieve/global/test.sieve

    Компиляция попутно проверяет скрипт и может выдать предупреждение, если в скрипте есть ошибка, или каталог скрипта недоступен для записи.
    После успешной компиляции, будет создан бинарник в том-же каталоге: /var/lib/dovecot/sieve/global/test.svbin

    Теперь самое время послать от имени тестового пользователя (в примере это будет "user@domain.tld") письмо самому себе. Желательно чтобы его "Входящие" были до того пусты (чтобы ничего не засоряло экран при тестировании).

    После получения письма, запустим sieve-filter в режиме тестирования (никаких изменений произведено не будет):

    # sieve-filter -u user@domain.tld /var/lib/dovecot/sieve/global/test.sieve 'INBOX'
    ...
    >> Filtering message:
     
      ID:      <d9247f3d56744301ku57139de5361b5b@domain.tld>
      Date:    Fri, 08 Jan 2013 08:26:43 +0300
      Size:    1297 bytes
      Subject: test
     
    Performed actions:
     
     * discard
     
    Implicit keep:
     
      (none)

    В ответ на ввод, получаем информацию о том, что этот скрипт может сделать с (единственным пока) письмом, если скрипт будет запущен с параметрами, указывающими применять изменения (сейчас он работает в режиме эмуляции). Главное здесь - Performed actions: . Это реальное действие, которому подвергнется письмо после обработки скриптом в режиме изменений.

    Переместим теперь письмо в папку "Trash" (Корзина) и протестируем рефильтеринг уже не в режиме эмуляции, а в режиме применения изменений.

    Для этого, после перемещения письма в папку "Trash", выполним в консоли:

    # sieve-filter -e -W -v -u user@domain.tld /var/lib/dovecot/sieve/global/test.sieve 'Trash' expunge
    ...
    info: filtering: [Fri, 08 Jan 2013 08:26:43 +0300; 1297 bytes] `test'.
    info: msgid=<d9247f3d56744301ku57139de5361b5b@domain.tld>: marked message to be discarded if not explicitly delivered (discard action).
    info: message expunged from source mailbox.

    "-e" - означает выполнить реальное действие
    "-W" - доступ на изменение
    "-v" - подробный отчет
    "expunge" - действие (удаление файла письма)

    Последние строки говорят о том, что сообщение было удалено.

    incron (Incrontab)

    Протестируем sieve-filter через incron.

    Если он не установлен - установим:

    # apt-get install incron

    Необходимо будет добавить "root" в список разрешенных.

    # nano /etc/incron.allow :

    root

    Далее отредактируем incrontab:

    # su root
    # incrontab -e

    Запишем следующую строку (ВАЖНО! - Incrontab очень чувствителен к лишним символам пробелов, табуляции и комментариям):

    /home/vmail/domain.tld/user/.Trash/cur/ IN_MOVED_TO /usr/bin/sieve-filter -e -W -u user@domain.tld /var/lib/dovecot/sieve/global/test.sieve Trash expunge

    Путь к Maildir-каталогу может быть другим.

    ВАЖНО! Аргумент Trash (предпоследний в строке) здесь должен быть без кавычек! В консоли работает и с кавычками, и без, а из incron - только без. Назначение папок tmp, new и cur формата Maildir - см. в Википедии. :) Кроме указанного выше способа, можно создать файл с произвольным именем в каталоге /etc/incron.d/ , и записать указанную строку в него.

    Повторим посылку себе письма, и, после его получения, переместим его в удаленном MUA-клиенте (например RoundCube, - мышью) в папку "Trash" (Корзина).

    После перемещения письмо должно сразу удалиться (сработает discard). Можно переместить так же и отправленное письмо из "Отправленные" в "Корзина" ("Trash"), и поскольку оно не удовлетворяет условиям в скрипте (совпадение в письме значений заголовков "Delivered-To" и "Return-Path"), то это письмо благополучно переместится, и удалено не будет.

    ВАЖНО! Это действительно тоже важно. Как будет работать подобная схема при наличии в целевой папке, например, 10 тыс. писем? Вопрос интересный...

    КСТАТИ! Если бы Sieve (или нечто подобное) обрабатывал IMAP-события, то Incron был бы не нужен. Но в Dovecot подобного нет.

    Важные подробности об incron см. здесь:
    # man 5 incrontab

    Использование sievec для компиляции Sieve скриптов

    Когда плагин Sieve выполняет скрипт первый раз (либо после того как были изменения), он компилирует его, и хранит в двоичном виде (байт-коде), чтобы избежать повторной компиляции каждый раз, при доставке почты.
    Pigeonhole Sieve использует расширение ".svbin" для хранимых откомпилированных скриптов. Для этого Sieve должен иметь доступ на запись в каталог, в котором выполняется скрипт.

    При выполнении глобального скрипта, здесь может возникнуть проблема. По соображениям безопасности, каталог глобального скрипта не должен быть доступен для записи пользователем. Таким образом, принцип первой компиляции может не сработать. Это не означает, что будет использована старая откомпилированная версия скрипта. Каждый раз, для каждого почтового сообщения будет происходить повторная компиляция текущей версии, что является крайне неэффективным.

    Для устранения этой проблемы, необходимо вручную скомпилировать глобальные скрипты с использованием инструмента командной строки sievec . Пример:

    sievec /var/lib/dovecot/sieve/global/

    Это необходимо для скриптов, перечисленных в sieve_global_path, sieve_before и sieve_after конфигурации. Для глобальных скриптов, которые вложены в другие скрипты, с использованием расширения Sieve "include", - этот шаг не является необходимым, так как вложенные скрипты уже включены в бинарник при компиляции родительского скрипта.

    Лог компиляции и выполнения

    Log-сообщения, выдаваемые во время компиляции или в ходе выполнения скрипта, записываются в двух местах с помощью плагина LDA Sieve:

    • Лог-файл пишется в тот же каталог, где находится главный пользовательский скрипт (указанный в настройке sieve). Файл журнала носит имя этого скрипта с добавлением расширения ".log", например .dovecot.sieve.log . Все ошибки или предупреждения скрипта добавляются в конец лога, пока он не становится слишком большим (10 кБ. в настоящее время). Когда это происходит, начальный файл журнала переименовывается в ".log.0" и запись продолжается в новый пустой файл. Информационные сообщения в лог не записываются - он остается нетронутым, пока не возникнут предупреждения или ошибки.
    • Сообщения, которые могли бы представлять интерес для системного администратора также записываются в стандартный Dovecot-лог (как правило, в системный журнал "syslog"). Записи включают все информационные сообщения, которые указывают, какие действия производились над входящими письмами. Ошибки компиляции, которые встречаются в пользовательских скриптах, здесь не фиксируются.

    Плагины Pigeonhole Sieve

    Интерпертатор Pigeonhole Sieve можно динамически расширять с помощью предлагаемых плагинов. Плагины могут быть сконфигурированы с помощью параметра sieve_plugins, в секции plugin {...} в конфигурационном файле /etc/dovecot/conf.d/90-sieve.conf .
    См. выше о sieve_plugins.

    Доступны в настоящее время следующие модули:

    • Extdata - пользовательское расширение языка, экспериментальное.
      Этот плагин добавляет поддержку конкретного "vnd.dovecot.extdata"-расширения, которое позволяет получить доступ к внешним строковым данным. Любой тип Dovecot-dic может быть указан в качестве источника данных.
    • Pipe [для Pigeonhole v0.2] - пользовательское расширение языка, экспериментальное.
      Этот плагин добавляет поддержку конкретного "vnd.dovecot.pipe"-расширения, которое позволяет перенаправить письмо заранее указанным внешним программам. Для Pigeonhole v0.3, те же функции (и даже больше) обеспечиваются плагином Extprograms.
    • Extprograms [с Pigeonhole v0.3] - пользовательское расширение языка, экспериментальное.
      Этот плагин добавляет поддержку для конкретных расширений: "vnd.dovecot.pipe", "vnd.dovecot.filter" и "vnd.dovecot.execute". Эти расширения добавляют новые команды для вызова действий предопределенного набора внешних программ (например shell-скриптов). Через эти программы, можно передавать или фильтровать сообщения, в которые передавать/получать строковые данные.

    Для подключения нужно загрузить исходники плагинов с сайта разработчиков. Компиляция может происходить с использованием параметра --with-dovecot= , поэтому необходимо обратиться к официальной документации. См. ссылки ниже.

    Расширения Pigeonhole Sieve

    Язык Sieve имеет разнообразные расширения. Обратите внимание, что сам Sieve не поддерживает выполнение внешних программ.

    Интерпретатор Pigeonhole Sieve распознает следующие расширения Sieve:

    Имя Статус Включено
    по умолчанию?
    Описание
    fileinto supported да Позволяет сохранять сообщения в папках, отличных от INBOX
    envelope supported да Позволяет оценить среду окружения ("sender", "recipient")
    encoded-character supported да Позволяет кодировать специальные символы цифрами
    copy supported да Позволяет сохранять и копировать сообщения, не отменяя неявного "keep"
    body supported да Позволяет оценивать тело сообщения
    variables supported да Добавляет поддержку переменных
    vacation supported да Обеспечивает функции автоответчика, например когда пользователь в отпуске
    vacation-seconds supported
    (v0.2.3+)
    нет Расширяет функциональность "vacation", позволяя повторять автоматические ответы с интервалом в секундах, а не днях
    relational supported да Позволяет использовать поддержку оценочных сравнений (напр.: "больше", "меньше", и т.п., а не только "эквивалентно" или т.п.)
    imap4flags supported да Позволяет добавлять к сохраненным сообщениям IMAP-флаги
    subaddress supported да Позволяет определять элементы, указанные через разделитель перед почтовым адресом (напр.: element#user@domain.tld)
    reject supported да Позволяет отклонять письма с сообщением об отказе
    enotify supported да Обеспечивает возможность отправки уведомлений с помощью различных средств (в настоящее время только mailto)
    mailbox supported да Проверяет существование папки и позволяет создавать папки через fileinto
    environment supported
    (v0.4.0+)
    да Позволяет определять значения меток окружающей среды исполнения
    date supported да Позволяет определять значения даты и времени в разном формате
    regex supported да Обеспечивает поддержку регулярных выражений
    editheader supported
    (v0.3.0+)
    нет Обеспечивает возможность добавлять и удалять поля заголовка сообщения
    ihave supported
    (v0.2.4+)
    да Добавляет возможность проверить наличие поддержки определенных расширений Sieve и динамически вызывать их
    spamtest и virustest supported
    (v0.1.16+)
    нет Реализует универсальный способ определения добавлений, вставляемых перед заголовками вирус-, спам-сканерами
    include supported да Позволяет инклудить другие скрипты Sieve
    imapflags (устаревшее) deprecated нет Старая версия imap4flags (для обратной совместимости с CMU Sieve)
    notify (устаревшее) deprecated нет Старая версия ENotify (для обратной совместимости с CMU Sieve)

    Интерпретатор Pigeonhole Sieve распознает так же следующие специфические расширения Dovecot, (некоторые из которых, только при условии подключения плагинов, - см. выше):

    Имя Статус Включено
    по умолчанию?
    Описание
    vnd.dovecot.debug supported
    (v0.3.0+)
    нет Позволяет регистрировать отладочные сообщения
    vnd.dovecot.duplicate experimental
    (v0.3.1+)
    нет Позволяет обнаруживать дубликаты сообщений, основываясь на Message-ID
    vnd.dovecot.extdata plugin нет Позволяет Sieve-скриптам получать информацию из внешних источников
    vnd.dovecot.pipe plugin (v0.2) /
    plugin (v0.3+)
    нет Реализует pipe-сообщение на заранее определенный набор внешних программ
    vnd.dovecot.filter plugin (v0.3+) нет Обеспечивает фильтрацию сообщений через заранее определенный набор внешних программ
    vnd.dovecot.execute plugin (v0.3+) нет Реализует выполнения заранее определенного набора внешних программ с возможностью обработки строковых данных через внешнюю программу

    Следует обратить внимание, что не все расширения включены по умолчанию (см. как включать выше).
    Устаревшие расширения, расширения, которые добавляют возможность изменения сообщения, расширения, которые требуют дополнительной настройки, и расширения, которые находятся в стадии разработки не будут включены без явного указания в конфигурации. Это означает, что настройки sieve_extensions (см. выше) или sieve_global_extensions (см. выше) должны быть скорректированы соответствующим образом. Кроме того, не достаточно только добавить имя плагина в параметре sieve_plugins (см. выше). Необходимо также включить и само расширение, - в явном виде.

    Информация по каждому плагину и расширению доступна на страницах официальной документации (см. ниже).

    Источники

    Источники информации и ссылки перечислены на отдельной странице, указанной внизу главной страницы темы:
    Установка и настройка почтового сервера

    Рекламные ссылки:
    Вопросы по теме статьи (просьба - без личностей), - присутствует премодерация:
       - регистрироваться НЕ обязательно! -

    Комментарий будет опубликован только после проверки

    Вы можете войти под своим логином или зарегистрироваться на сайте.

    (обязательно)