Sieve
Sieve — язык описания правил фильтрации для почтовых сообщений. Создан компанией Cyrusoft International, Inc./ISAMET во время работы над почтовым сервером Cyrus IMAP[англ.].
История
[править | править код]- В январе 2001 года спецификация языка была описана в RFC 3028 (автор — Tim Showalter).
- В сентябре 2003 года было утверждено расширение «Sieve Email Filtering — Subaddress Extension»: RFC 3598 (K. Murchison, Oceana Matrix Ltd.)
- В феврале 2004 года было утверждено расширение «SIEVE Email Filtering: Spamtest and VirusTest Extensions»: RFC 3685 (C. Daboo, Cyrusoft International, Inc.)
- Компания Cyrusoft объявила о банкротстве 1 октября 2005 года. После этого работа над Sieve была продолжена сообществом opensource, в том числе рабочей группой Sieve организации IETF.
- В 2008 году была утверждена новая спецификация языка в RFC 5228 и множество расширений.
Расширения
[править | править код]В январе 2008 года рабочая группа Sieve[1] обновила базовую спецификацию языка, создав RFC 5228 на замену первоначальному RFC 3028, и добавила следующие расширения в статусе "Предложение к стандартизации" (англ. Proposed Standard):
- RFC 5173 (англ.) — «Sieve Email Filtering: Body Extension» — расширение для проверки скриптом не только заголовков, но и тела (текста) сообщения.
- RFC 5229 (англ.) — «Sieve Email Filtering: Variables Extension» — позволяет скрипту сохранять и читать значения переменных.
- RFC 5230 (англ.) — «Sieve Email Filtering: Vacation Extension» — описывает действия по отправке ответа, информирующего отправителя о том, что получатель может отсутствовать.
- RFC 5231 (англ.) — «Sieve Email Filtering: Relational Extension» — описывает относительные проверки, также можно проверять не только значение поля, но и число вхождений проверямого значения в поля заголовка и конверта сообщения.
- RFC 5232 (англ.) — «Sieve Email Filtering: Imap4flags Extension» — позволяет скрипту проверять и устанавливать флаги IMAP4 для сообщения.
- RFC 5233 (англ.) — «Sieve Email Filtering: Subaddress Extension» — позволяет скрипту проверять «субадреса» — адреса вида "user [email protected]" (адреса такого вида используются в sendmail в virtusertable).
- RFC 5235 (англ.) — «Sieve Email Filtering: Spamtest and Virustest Extensions» — позволяют скрипту взаимодействовать с антивирусами и программами детектирования спама.
В дальнейшем этой рабочей группой было добавлено множество расширений в том же статусе "Предложение к стандартизации":
- RFC 5293 (англ.) — «Sieve Email Filtering: Editheader Extension» — позволяет скрипту добавлять и удалять поля заголовка письма.
- RFC 5429 (англ.) — «Sieve Email Filtering: Reject and Extended Reject Extensions» — позволяет отвергнуть сообщения на этапе LMTP/SMTP либо с уведомлением MDN (англ. Message Disposition Notifications) или DSN (англ. Delivery Status Notification).
- RFC 5435 (англ.) — «Sieve Email Filtering: Extension for Notifications» — позволяет скрипту переключить «внешние» уведомления об ожидающей доставки почты (например, отправить SMS или сообщение XMPP).
- RFC 5436 (англ.) — «Sieve Notification Mechanism: mailto» — описывает уведомления по электронной почте.
- RFC 5437 (англ.) — «Sieve Notification Mechanism: Extensible Messaging and Presence Protocol (XMPP)» — описывает профиль для отправки уведомлений посредством XMPP (Jabber).
- RFC 5490 (англ.) — «The Sieve Mail-Filtering Language — Extensions for Checking Mailbox Status and Accessing Mailbox Metadata» — позволяет проверить наличие почтового ящика и создать почтовый ящик.
- RFC 5703 (англ.) — «Sieve Email Filtering: MIME Part Tests, Iteration, Extraction, Replacement, and Enclosure» — позволяет анализировать и манипулировать MIME-частями тела сообщения.
Документы в разработке (статус «Draft»):
- draft-ietf-sieve-notify-sip-message-08 (англ.) — «Sieve Notification Mechanism: SIP MESSAGE».
- draft-ietf-sieve-include-15 (англ.) — «Sieve Email Filtering: Include Extension» — возможность включать в текст скрипта другой файл.
- draft-ietf-sieve-convert-06 (англ.) — «Sieve Extension for Converting Messages Before Delivery».
Разработка новых расширений продолжается.
Синтаксис языка
[править | править код]Комментарии
[править | править код]Как и любой язык, Sieve имеет комментарии. Существуют два типа комментариев: многострочные и однострочные.
Многострочные комментарии состоят из нескольких строк, должны начинаться с символов «/*» и заканчиваться «*/».
/* это многострочный комментарий */
Однострочные комментарии комментируют только одну строку, в начале которой стоит «#».
# это # однострочные # комментарии
Структурные операторы
[править | править код]- [ .. ]
- Квадратные скобки используются для группировки элементов. Например, ["[email protected]", "[email protected]", "[email protected]"] определяет группу почтовых ящиков.
- { .. }
- Фигурные скобки используются для создания группы действий, который будут выполнены, если условие выполняется.
- if
- Сравнивает определённые параметры. Если они истинны, то выполняется определённый блок операторов.
- elsif
- Если используется несколько сравнений, то лучше всего использовать elsif. Действие аналогично if.
- else
- Если ни одно из вышеследующих условий не выполнилось, то выполняются операторы, заключённые в { .. } после else.
- stop
- Останавливает обработку письма.
Действия над письмами
[править | править код]- keep
- Сохраняет копию сообщения в каталоге по умолчанию.
- fileinto "каталог"
- Перемещает письмо в указанный каталог. Если он не существует, то письмо сохраняется в каталоге по умолчанию, и больше никаких действий не выполняется.
- discard
- Удаляет письмо. Уведомление об удалении не отсылается.
- reject "<причина>"
- Возвращает отправителю письмо, в котором указывается причина ошибки доставки.
- redirect "<почтовый ящик>"
- Перенаправляет сообщение на указанный почтовый ящик. Копия сообщения не создаётся.
- vacation <параметры>
- Автоматически отвечает на письмо.
Операторы сравнения
[править | править код]- size
- Сравнивает размер полученного письма с определённым размером. Можно указать размер в байтах, килобайтах и мегабайтах, для этого нужно указать KB или MB (для килобайт или мегабайт соответственно) после необходимого размера файла.
- header
- Сравнивает заголовок письма с определёнными параметрами.
- address
- Сравнивает только поле адреса.
- allof(<параметры>)
- Сравнивает несколько значений, которые указаны как параметры. Возвращает истину, если все условия выполняются.
- anyof(<параметры>)
- Сравнивает несколько значений, которые указаны как параметры. Возвращает истину, если хотя бы одно условие выполняется.
- true
- Имеет всегда истинное значение.
- false
- Имеет всегда ложное значение.
- not <параметр>
- Если параметр имеет значение ложь, то всё выражение имеет значение истина.
Пример
[править | править код]require ["fileinto", "vacation"]; # # удаляем все письма, отмеченные сервером как спам # if header :is "X-Spam-Flag" "YES" { discard; # поверим Spam Assassin } # # Письма, относящиеся к Важному Проекту, положим в специальную папку # if anyof( address :domain "from" "important.ru", address "from" [ "[email protected]", "[email protected]" ], address ["to","cc"] "[email protected]" ) { fileinto "Customers.Important"; } # # В ответ на письмо из своей компании с запросом отчёта, немедленно ответим :) # if allof (address :domain "from" "mycompany.ru", header :contains "subject" ["отчёт", "отчёт"]) { vacation :days 1 :addresses "[email protected]" :subject "В ответ на ваш запрос" :mime "MIME-Version: 1.0 Content-Type: text/html; charset=KOI8-R Content-Transfer-Encoding: 7bit <!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"> <HTML><HEAD><META http-equiv=Content-Type content=\"text/html; charset=windows-KOI8-R\"></HEAD> <BODY>К сожалению, отчёт пока выслать не могу. (Это пример ответа на письмо с заданным заголовком.)</BODY></HTML>"; }
Ссылки
[править | править код]- Sieve.Info — Wiki-сайт с информацией о Sieve (англ.)
- RFC 5228 — Спецификация языка Sieve (англ.)
- ↑ Sieve working group charter Архивировано 31 декабря 2005 года. (англ.)