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+detail@domain.example" (адреса такого вида используются в 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 имеет комментарии. Существуют два типа комментариев: многострочные и однострочные.
Многострочные комментарии состоят из нескольких строк, должны начинаться с символов «/*» и заканчиваться «*/».
/* это многострочный комментарий */
Однострочные комментарии комментируют только одну строку, в начале которой стоит «#».
# это # однострочные # комментарии
Структурные операторы
- [ .. ]
- Квадратные скобки используются для группировки элементов. Например, ["user1@domain.ru", "user2@domain.ru", "user3@domain.ru"] определяет группу почтовых ящиков.
- { .. }
- Фигурные скобки используются для создания группы действий, который будут выполнены, если условие выполняется.
- 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" [
"important.personal@gmail.com",
"important.other@gmail.com"
],
address ["to","cc"] "projects.important@mycompany.ru"
) {
fileinto "Customers.Important";
}
#
# В ответ на письмо из своей компании с запросом отчёта, немедленно ответим :)
#
if allof (address :domain "from" "mycompany.ru", header :contains "subject" ["отчёт", "отчёт"]) {
vacation :days 1 :addresses "reports@mycompany.ru" :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 года. (англ.)