Описание параметра conditions

Элементарное (единичное, простое) Условие, в общем случае, состоит из трех элементов: Поля, Предиката и Образца.

  • Поле (field) — «что сравниваем», какое-то свойство письма, которое требуется проверить.
  • Предикат (matcher) — «как сравниваем», операция сравнения (равно, не равно, содержит, существует и т.п.)
  • Образец (pattern) — «с чем сравниваем», строка-образец с которой осуществляется сравнение выбранного поля.
Запись условия Описание Примеры
{ "field": "value" } Значение поля field равно value { "address:from": "friend@mail.ru" }
{ "attach:filename": "Квитанция.pdf" }
{ "field": [ "value1", "value2", ... ] } Значение поля field равно или value1 , или value2 и т.д. { "from": [ "Alice", "Bob" ] }
{ "field": { "operation": "value" } } Значение поля field сравнивается со значением value с помощью операции operation { "subject": { "$contains": "выигрыш" } }
{ "header:return-path": { "$not-contains": "@gmail.com" } }
{ "field": { "$base64": "dmFsdWU=" } } Значение поля field равно value , записанному в формате base64 { "address:from": { "$base64": "ZnJpZW5kQG1haWwucnU=" } }
{ "field": { "$exists": true/false } } Поле field существует /не существует (имеет смысл для проверки заголовков) { "header:return-path": { "$exists": true } }
{ "header:x-yandex-forward": { "$exists": false } }
{ "field": { "operation": { "group": [ "value1", { "$base64": "dmFsdWUy" }, ... ] } } } Поле field проверяется в соответствии с operation с группой group значений value1 , value2 (задано в base64) и т.д. { "subject": { "$contains": { "$any": [ "hello", "bye" ] } } }
{ "body": { "$not-contains": { "$all": [ { "$base64": "0J/RgNC40LLQtdGC" }, { "$base64": "0J/QvtC60LA=" } ] } }
Запись условия Описание Примеры
{ "field": "value" } Значение поля field равно value { "address:from": "friend@mail.ru" }
{ "attach:filename": "Квитанция.pdf" }
{ "field": [ "value1", "value2", ... ] } Значение поля field равно или value1 , или value2 и т.д. { "from": [ "Alice", "Bob" ] }
{ "field": { "operation": "value" } } Значение поля field сравнивается со значением value с помощью операции operation { "subject": { "$contains": "выигрыш" } }
{ "header:return-path": { "$not-contains": "@gmail.com" } }
{ "field": { "$base64": "dmFsdWU=" } } Значение поля field равно value , записанному в формате base64 { "address:from": { "$base64": "ZnJpZW5kQG1haWwucnU=" } }
{ "field": { "$exists": true/false } } Поле field существует /не существует (имеет смысл для проверки заголовков) { "header:return-path": { "$exists": true } }
{ "header:x-yandex-forward": { "$exists": false } }
{ "field": { "operation": { "group": [ "value1", { "$base64": "dmFsdWUy" }, ... ] } } } Поле field проверяется в соответствии с operation с группой group значений value1 , value2 (задано в base64) и т.д. { "subject": { "$contains": { "$any": [ "hello", "bye" ] } } }
{ "body": { "$not-contains": { "$all": [ { "$base64": "0J/RgNC40LLQtdGC" }, { "$base64": "0J/QvtC60LA=" } ] } }

Составные (сложные) условия могут быть образованы из других условий, как простых так и сложных, с помощью объединения их в логические группы по «И» (все должны быть выполнены) или по «ИЛИ» (достаточно выполнения хотя бы одного).

Запись условия Описание Примеры
{ "field1": "value1", "field2": { "operation": "value2" } } Значение поля field1 равно value1, И при этом значение field2 соответсвует value2 (согласно предикату operation) { "from": "friend@mail.ru", "attach:filename": "Квитанция.pdf" }
{ "logic-operation": [ { "field1": "value1" }, { "field2": { "operation": "value2" } } ]} Условия:
- значение поля field1 равно value1
- значение field2 соответсвует value2 (согласно предикату operation)
объединены в соответствии с logic-operation (И или ИЛИ)
{ "$and": [ { "from": "friend@mail.ru" }, { "attach:filename": "Квитанция.pdf" }]}
{ "$or": [ { "from": "friend@mail.ru" }, { "attach:filename": "Квитанция.pdf" }]}
Запись условия Описание Примеры
{ "field1": "value1", "field2": { "operation": "value2" } } Значение поля field1 равно value1, И при этом значение field2 соответсвует value2 (согласно предикату operation) { "from": "friend@mail.ru", "attach:filename": "Квитанция.pdf" }
{ "logic-operation": [ { "field1": "value1" }, { "field2": { "operation": "value2" } } ]} Условия:
- значение поля field1 равно value1
- значение field2 соответсвует value2 (согласно предикату operation)
объединены в соответствии с logic-operation (И или ИЛИ)
{ "$and": [ { "from": "friend@mail.ru" }, { "attach:filename": "Квитанция.pdf" }]}
{ "$or": [ { "from": "friend@mail.ru" }, { "attach:filename": "Квитанция.pdf" }]}

Поле

Полное название поля формируется из названия группы (если присутствует) и названия поля разделенных символом : - "группа:поле" или "поле". Некоторые группы, например address, могут быть опущены, а некоторые, например header, обязательны.

Множество допустимых полей

Группа Поле Описание Примеры
address from
to
cc
tocc
email или display-name
- отправителя
- получателя
- получателя копии
- получателя или получателя копии
address:from
from
address:to
...
address:tocc
tocc
subject Тема письма subject
header произвольная строка Заголовок письма header:x-yandex-spam
header:return-path
...
body Тело письма body
attach filename Название файла-вложения attach:filename
Группа Поле Описание Примеры
address from
to
cc
tocc
email или display-name
- отправителя
- получателя
- получателя копии
- получателя или получателя копии
address:from
from
address:to
...
address:tocc
tocc
subject Тема письма subject
header произвольная строка Заголовок письма header:x-yandex-spam
header:return-path
...
body Тело письма body
attach filename Название файла-вложения attach:filename

Предикат

Предикат Описание
$eq Совпадает, равно
$ne Не совпадает, не равно
$contains Содержит
$not-contains Не содержит
$exists Существует (не существует)
Предикат Описание
$eq Совпадает, равно
$ne Не совпадает, не равно
$contains Содержит
$not-contains Не содержит
$exists Существует (не существует)

Образец

Образец обычно представляет строку для сравнения заданным способом с содержимым некоторого поля. Если образец трудно представить непосредственно в виде строки, то можно передать его в закодированном виде, base64.

Запись условия Описание Примеры
{ "field": { "$base64": "dmFsdWU=" } } Значение поля field равно value , записанному в формате base64 { "address:from": { "$base64": "ZnJpZW5kQG1haWwucnU=" } }
Запись условия Описание Примеры
{ "field": { "$base64": "dmFsdWU=" } } Значение поля field равно value , записанному в формате base64 { "address:from": { "$base64": "ZnJpZW5kQG1haWwucnU=" } }
Пример 1: 'От кого' совпадает c 'hello@ya.ru'
Пример 1: 'От кого' совпадает c 'hello@ya.ru'

address:from=="hello@ya.ru"

{ "address:from": "hello@ya.ru" }
Скопировано
Пример 2: 'От кого' совпадает c 'hello@ya.ru' (задано в base64)
Пример 2: 'От кого' совпадает c 'hello@ya.ru' (задано в base64)

address:from=="fromBase64('aGVsbG9AeWEucnU=')"

{ "from": { "$base64": "aGVsbG9AeWEucnU=" } }
Скопировано
Пример 3: 'От кого' содержит '@yandex.ru' И в теме письма есть 'hello' ИЛИ 'bye'
Пример 3: 'От кого' содержит '@yandex.ru' И в теме письма есть 'hello' ИЛИ 'bye'

address:from=="%@yandex.ru%" AND (header:subject=="%hello%" OR header:subject=="%bye%")

{
    "address:from": { "$contains": "@yandex.ru" },
    "subject": { "$contains": [ "hello", "bye" ] }
}
Скопировано

или

{
    "$and": [
        { "address:from": { "$contains": "@yandex.ru" } },
        { "subject": { "$contains": { "$any": [ "hello", "bye" ] } } }
    ]
}
Скопировано

или

{
    "$and": [
        { "address:from": { "$contains": "@yandex.ru" } },
        { "$or": [ {"subject": { "$contains": "hello" } }, { "subject": { "$contains": "bye"} } ] }
    ]
}
Скопировано
Пример 4: Присутствует заголовок 'x-yandex-spam'
Пример 4: Присутствует заголовок 'x-yandex-spam'

header:x-spam-flag EXISTS

{ "header:x-spam-flag": { "$exists": true } }
Скопировано
Пример 5: Для заголовока 'x-yandex-spam' задано значение 'yes'
Пример 5: Для заголовока 'x-yandex-spam' задано значение 'yes'

header:x-spam-flag=="yes"

{ "header:x-spam-flag": "yes" }
Скопировано
Пример 6: Для заголовока 'x-yandex-spam' задано значение отличное от 'yes'
Пример 6: Для заголовока 'x-yandex-spam' задано значение отличное от 'yes'

header:x-spam-flag!="yes"

{ "header:x-spam-flag": { "$ne": "yes" } }
Скопировано

Грамматика описания условий

%start
    : CONDITION

CONDITION
    : {}
    | { CONDITION_PAIR, ... }

CONDITION_PAIR
    : KEY: COMPARISON
    | HEADER_KEY: EXIST_VALUE
    | "$and": [ CONDITION, ... ]
    | "$or":  [ CONDITION, ... ]

COMPARISON
    : VALUE
    | VALUE_LIST
    | { OP: VALUE }
    | { OP: VALUE_LIST }

KEY
    : "address:from" | "address:to" | "address:cc" | "address:tocc" | "from" | "to" | "cc" | "tocc"
    | "subject"
    | "body"
    | "attach:filename"
    | HEADER_KEY

HEADER_KEY
    : "header:HEADER_NAME"

OP
    : "$eq"
    | "$ne"
    | "$contains"
    | "$not-contains"

VALUE
    :  STRING
    | { "$base64": STRING }

VALUE_LIST
    : [ VALUE, ... ]
    | { "$any": [ VALUE, ... ] }
    | { "$all": [ VALUE, ... ] }

EXIST_VALUE
    : { "$exists": BOOLEAN }

HEADER_NAME
    : [-_a-zA-Z0-9]+

STRING
    : ".*"

BOOLEAN
    : true
    | false
Скопировано