Описание параметра 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 сравнивается со значением value с помощью операции operation

{ "field": { "operation": "value" } }
{ "subject": { "$contains": "выигрыш" } }
{ "header:return-path": { "$not-contains": "@gmail.com" } }

Значение поля field равно value, записанному в формате base64

{ "field": { "$base64": "dmFsdWU=" } }
{ "address:from": { "$base64": "ZnJpZW5kQG1haWwucnU=" } }

Поле field существует / не существует (имеет смысл для проверки заголовков)

{ "field": { "$exists": true/false } }
{ "header:return-path": { "$exists": true } }
{ "header:x-yandex-forward": { "$exists": false } }

Поле field проверяется в соответствии с operation с группой group значений value1, value2 и т. д. (заданы в base64)

{
  "field": {
    "operation": {
      "group": [
        "value1",
        { "$base64": "dmFsdWUy" },
        ...
      ]
    }
  }
}
{
  "subject": {
    "$contains": {
      "$any": [ "hello", "bye" ]
    }
  }
}
{
  "body": {
    "$not-contains": {
      "$all": [
        { "$base64": "0J/RgNC40LLQtdGC" },
        { "$base64": "0J/QvtC60LA=" }
      ]
    }
  }
}

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

Условие

Примеры

Значение поля field1 равно value1 И при этом значение field2 соответствует value2 (согласно предикату operation)

{
  "field1": "value1",
  "field2": { "operation": "value2" }
}
{
  "from": "friend@mail.ru",
  "attach:filename": "Квитанция.pdf"
}

Условия:

  • значение поля field1 равно value1
  • значение field2 соответствует value2 (согласно предикату operation)

объединены в соответствии с logic-operation (И или ИЛИ)

{
  "logic-operation": [
    { "field1": "value1" },
    { "field2": { "operation": "value2" } }
  ]
}
{
  "$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

Предикат

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

Образец

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

Условие

Примеры

Значение поля field равно value, записанному в формате base64

{ "field": { "$base64": "dmFsdWU=" } }
{
  "address:from": {
    "$base64": "ZnJpZW5kQG1haWwucnU="
  }
}
Пример 1: 'От кого' совпадает c 'hello@ya.ru'

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

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

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

{ "from": { "$base64": "aGVsbG9AeWEucnU=" } }
Пример 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'

header:x-spam-flag EXISTS

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

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

{ "header:x-spam-flag": "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