Interested Article - Sieve

Sieve — язык описания правил фильтрации для почтовых сообщений. Создан компанией во время работы над почтовым сервером en .

История

  • В январе 2001 года спецификация языка была описана в RFC (автор — Tim Showalter).
  • В сентябре 2003 года было утверждено расширение «Sieve Email Filtering — Subaddress Extension»: (K. Murchison, Oceana Matrix Ltd.)
  • В феврале 2004 года было утверждено расширение «SIEVE Email Filtering: Spamtest and VirusTest Extensions»: (C. Daboo, Cyrusoft International, Inc.)
  • Компания объявила о банкротстве 1 октября 2005 года . После этого работа над Sieve была продолжена сообществом opensource, в том числе рабочей группой Sieve организации IETF .
  • В 2008 году была утверждена новая спецификация языка в и множество расширений.

Расширения

В январе 2008 года рабочая группа Sieve обновила базовую спецификацию языка, создав на замену первоначальному , и добавила следующие расширения в статусе "Предложение к стандартизации" ( англ. Proposed Standard ):

  • (англ.) — «Sieve Email Filtering: Body Extension» — расширение для проверки скриптом не только заголовков, но и тела (текста) сообщения.
  • (англ.) — «Sieve Email Filtering: Variables Extension» — позволяет скрипту сохранять и читать значения переменных.
  • (англ.) — «Sieve Email Filtering: Vacation Extension» — описывает действия по отправке ответа, информирующего отправителя о том, что получатель может отсутствовать.
  • (англ.) — «Sieve Email Filtering: Relational Extension» — описывает относительные проверки, также можно проверять не только значение поля, но и число вхождений проверямого значения в поля заголовка и конверта сообщения.
  • (англ.) — «Sieve Email Filtering: Imap4flags Extension» — позволяет скрипту проверять и устанавливать флаги IMAP4 для сообщения.
  • (англ.) — «Sieve Email Filtering: Subaddress Extension» — позволяет скрипту проверять «субадреса» — адреса вида "[email protected]" (адреса такого вида используются в sendmail в virtusertable).
  • (англ.) — «Sieve Email Filtering: Spamtest and Virustest Extensions» — позволяют скрипту взаимодействовать с антивирусами и программами детектирования спама.

В дальнейшем этой рабочей группой было добавлено множество расширений в том же статусе "Предложение к стандартизации":

  • (англ.) — «Sieve Email Filtering: Editheader Extension» — позволяет скрипту добавлять и удалять поля заголовка письма .
  • (англ.) — «Sieve Email Filtering: Reject and Extended Reject Extensions» — позволяет отвергнуть сообщения на этапе LMTP / SMTP либо с уведомлением MDN ( англ. Message Disposition Notifications ) или DSN ( англ. Delivery Status Notification ).
  • (англ.) — «Sieve Email Filtering: Extension for Notifications» — позволяет скрипту переключить «внешние» уведомления об ожидающей доставки почты (например, отправить SMS или сообщение XMPP ).
  • (англ.) — «Sieve Notification Mechanism: mailto» — описывает уведомления по электронной почте.
  • (англ.) — «Sieve Notification Mechanism: Extensible Messaging and Presence Protocol (XMPP)» — описывает профиль для отправки уведомлений посредством XMPP (Jabber).
  • (англ.) — «The Sieve Mail-Filtering Language — Extensions for Checking Mailbox Status and Accessing Mailbox Metadata» — позволяет проверить наличие почтового ящика и создать почтовый ящик.
  • (англ.) — «Sieve Email Filtering: MIME Part Tests, Iteration, Extraction, Replacement, and Enclosure» — позволяет анализировать и манипулировать MIME-частями тела сообщения.

Документы в разработке (статус «Draft»):

  • (англ.) — «Sieve Notification Mechanism: SIP MESSAGE».
  • (англ.) — «Sieve Email Filtering: Include Extension» — возможность включать в текст скрипта другой файл.
  • (англ.) — «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>";
 }

Ссылки

  • — Wiki-сайт с информацией о Sieve (англ.)
  • — Спецификация языка Sieve (англ.)
  1. 31 декабря 2005 года. (англ.)
Источник —

Same as Sieve