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
(англ.)
-
31 декабря 2005 года.
(англ.)