Dovecot 2 - Sieve
Вольный перевод официальной документации по Sieve в Dovecot 2. В одной заметке собраны разные части документации, которые могут быть наиболее полезны, + отсебятина. Значения параметров в конфигурационных файлах, механизм работы скриптов, скриптовые цепочки и пр.
ВАЖНО! Эта страница является частью списка заметок о настройке почтовой системы (Postfix+Dovecot и пр.).
Родительская страница - обязательна к просмотру: Установка и настройка почтового сервера
Подробнее о конфигурации к которой относятся примеры в этой статье - см. ссылку выше.
Тем же - коротко об основных терминах (MTA, MDA, MUA и т.п.).
Эта заметка имеет характер исследования. Все упомянутые в заметке эксперименты проводились на ОС Debian. Пожалуйста не используйте слепое копирование примеров. Автор не гарантирует, что применение изложенной здесь информации не приведет к потере данных.
Содержание
- Важные замечания
- Описание конфигурации
- Базовая конфигурация
- Конфигурируемые лимиты
- Размещение скриптов
- Специфические расширения, требующие конфигурирования
- Месторасположение пользовательских Sieve-скриптов
- Выполнение нескольких скриптов последовательно
- Sieve и LMTP
- ManageSieve сервер
- Установка ManageSieve
- Настройки конфигурации протокола ManageSieve
- Настройки конфигурации Sieve для ManageSieve
- Квоты (лимиты) для ManageSieve
- Пример настроек для ManageSieve
- Использование Pigeonhole Sieve
- Имена каталогов
- Включение скрипта в скрипт (include)
- Автоответчик vacation
- Конфигурирование расширения vacation
- Пример скрипта Vacation
- Расширения spamtest и virustest
- Плагин sieve_pipe и расширение vnd.dovecot.pipe
- Расширение vnd.dovecot.duplicate
- Использование sieve-filter на примере сравнения заголовков
- Использование sievec для компиляции Sieve скриптов
- Лог компиляции и выполнения
- Плагины Pigeonhole Sieve
- Расширения Pigeonhole Sieve
- Источники
Важные замечания
-
Dovecot-sieve обрабатывает только входящую почту (срабатывает на событие доставки почты Dovecot-LDA или lmtp). Поэтому манипуляции с почтой, производимые, например IMAP, не подвергаются обработке. После того как почта доставлена (после явного или неявного "stop"), Sieve теряет всякий контроль над ней. Впрочем, можно заставить Sieve обработать всю почту в определенной папке с помощью инструмента командной строки
sieve-filter , например перехватив событие файловой системы с помощью Incron. См. ниже Использование sieve-filter на примере сравнения заголовков. -
Под ящиком здесь подразумевается корневой почтовый каталог пользователя, включающий все вложенные папки. Каталоги/папки пользователя расположены в пределах почтового ящика.
-
Много интересной информации как обычно, - в документации, доступной после установки, например:
/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
sievec
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
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
path
<option>
sieve_dir= location
bindir=<dirpath> - Каталог, - место хранения скомпилированных бинарников. Если этот параметр пропущен, то он определяется параметром <type>
Специфические расширения, требующие конфигурирования
Расширения языка 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
Sieve и LMTP
В Dovecot 2 была добавлена поддержка LMTP. Так же как и в Dovecot-LDA, в нем можно воспользоваться поддержкой Pigeonhole Sieve. Поскольку у LMTP есть секция настройки protocol lmtp{...}
Например для файла /etc/dovecot/conf.d/20-lmtp.conf
plugin { ... mail_plugins = $mail_plugins sieve }
ManageSieve сервер
ManageSieve-сервер - это возможность пользователям создавать свои правила для входящей почты. Если он запущен и доступен для использования в MUA, то каждый пользователь может загружать на сервер персональные почтовые фильтры (свои собственные Sieve-скрипты), - без необходимости доступа к shell или FTP, а также создавать их используя например web-интерфейс почтового клиента.
Поддержка осуществляется "Pigeonhole project". Он доступен как отдельный Dovecot сервис.
Установка 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-протокола в соответствующий параметр конфигурации:
/etc/dovecot/dovecot.conf
...
#!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp sieve
...
Закомментированная строка содержит путь к папке, где после установки ManageSieve должен появиться файл наподобие managesieved.protocol. Но наверное все-же лучше указывать подключение протоколов вручную чем используя инклуд каталога, т.к. не все установленные протоколы могут быть нужны.
ВАЖНО! В новых версиях Dovecot в параметре
После подключения # service dovecot restart
# 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";
а скрипт include :personal "my-own-spam"
Автоответчик vacation
См. заметку - обзор разных механизмов реализации автоответчиков.
vacation (расширение Pingeonhole Sieve) оперирует с sender (отправитель) и recipient (получатель). Они берутся из:
Vacation автоматически отвечает отправителю сообщения.
Список отправителей, для которых срабатывает автоответчик Vacation, хранится в файле .dovecot.lda-dupes
Автоматические ответы не отправляются в любом из следующих случаев:
- 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:"
Обратный адрес в письме, отправленном самим автоответчиком, выглядит как /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {...}
Конфигурирование расширения vacation
Расширение vacation доступно по умолчанию. В отличие от него, расширение
Расширения vacation и
Следующие настройки могут быть сконфигурированы для расширения vacation в /etc/dovecot/conf.d/90-sieve.conf
plugin {...}
sieve_vacation_min_period = 1d
Этот параметр указывает минимальный период, который может быть указан для тегов :days и :seconds. Минимум "0" - означает, что пользователи могут указывать отправление сообщения автоответчика для каждого входящего сообщения, которое удовлетворяет другим критериям ответа (см.
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
Расширения spamtest, spamtestplus и virustest не включены по умолчанию, следовательно, они должны быть включены явно в параметре sieve_extensions.
Следующие параметры должны быть указаны в файле конфигурации для использования расширений spamtest и spamtestplus. Расширение virustest имеет идентичные параметры конфигурации, но с префиксом 'sieve_virustest_' вместо 'sieve_spamtest_':
sieve_spamtest_status_type = "score" / "strlen" / "text"
Этот параметр определяет тип статуса результата, произведенного спам/антивирусным сканером. Это может быть либо числом (score), строкой значимого количества одинаковых символов (strlen), например:
sieve_spamtest_status_header =
Этот параметр указывает, что поле заголовка содержит информацию результата спам-сканера, - в нем может использоваться синтаксис содержимого заголовка. Если соответствующий заголовок не будет найден, команда будет "0".
Это структурируемая настройка. Первая часть определяет имя поля заголовка. Опционально, POSIX регулярное выражение следует полю заголовка, отделенного двоеточием. Любой пробел непосредственно после двоеточия не является частью регулярного выражения. Если регулярное выражение опущено, принимается любое содержимое заголовка и используется полное значение заголовка. Если регулярное выражение используется, то в нем должно быть указано одно совпадение
sieve_spamtest_max_value =
Этот параметр определяет максимальное значение числового
sieve_spamtest_max_header =
Некоторые
sieve_spamtest_text_valueX =
Когда параметр sieve_spamtest_status_type установлен
Пример конфигурации 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=
См. ссылки ниже.
Пример настройки через сокет с использованием параметра
/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 { } }
Пример настройки прямого выполнения с использованием параметра
/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
Это расширение позволяет обнаруживать дубликаты писем по
В официальном описании указано, что дубликаты проверяются только у тех писем, которые ранее уже были просмотрены расширением. Из этого следует как минимум то, что если первое из дублирующихся писем будет помещено в ящик каким-нибудь другим способом, минуя расширение, то следующее письмо, даже будучи дубликатом, при обработке расширением дубликатом считаться не будет.
А как максимум - судя по-всему, это расширение вообще даже не просматривает уже доставленные письма и не обращается к ящику пользователя, а имеет дело только с еще не доставленными письмами, в момент их доставки.
ВАЖНО! Тестирование показало, что если в скрипте сначала идет fileinto "SubFolder";
if duplicate { ... }
Еще один эксперимент показал, что вставка в код даже пустого блока if duplicate { }
Настройка сводится к добавлению значения в параметр 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_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"; }
ВАЖНО! На момент написания заметки, из репозитариев устновился пакет # if duplicate :seconds 60 {
На сайте разработчика (см. Источники), присутствует информация о том, что в этом расширении период указывается в файле /etc/dovecot/conf.d/90-sieve.conf
Кроме того, на сайте разработчика, в последней версии расширения описано интересное свойство, - можно указывать имя для каждого блока кода, например: # if duplicate "name_one" {
# if duplicate "name_other" {
Тестирование
Самый простой способ протестировать этот скрипт - временно указать в 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";
Не забываем вернуть 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
На мой взгляд, наиболее интересный из них -
Когда я тестировал его, то мне так и не удалось заставить работать с его помощью скрипт из предыдущего раздела (для расширения
Можно использовать
Incrontab (incron) - работает подобно Cron, но инициируется не по времени, как Cron, а событиями файловой системы, что позволяет, например, отслеживать заданную папку и запускать скрипт по событиями в ней (например при создании файла, удалении, перемещении и т.п.). И кстати, в скрипт можно передать имя файла, с которым произошло событие, в подконтрольной папке.
ВАЖНО! 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
Теперь самое время послать от имени тестового пользователя (в примере это будет
После получения письма, запустим 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", например
. Все ошибки или предупреждения скрипта добавляются в конец лога, пока он не становится слишком большим (10 кБ. в настоящее время). Когда это происходит, начальный файл журнала переименовывается в ".log.0" и запись продолжается в новый пустой файл. Информационные сообщения в лог не записываются - он остается нетронутым, пока не возникнут предупреждения или ошибки..dovecot.sieve.log
- Сообщения, которые могли бы представлять интерес для системного администратора также записываются в стандартный 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:
Интерпретатор 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 (см. выше). Необходимо также включить и само расширение, - в явном виде.
Информация по каждому плагину и расширению доступна на страницах официальной документации (см. ниже).
Источники
Источники информации и ссылки перечислены на отдельной странице, указанной внизу главной страницы темы:
Установка и настройка почтового сервера
2018-11-04 в 02:09:25
adrenalin l2 - adrenaline bot lineage 2, адреналин бот официальный сайт