---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://yandex.ru/dev/api360-preview/doc/ru/routing.md
  - href: ru/routing.md
    type: text/markdown
    title: Markdown version
  - href: llms.txt
    type: text/markdown
    title: llms.txt
sourcePath: docs/dev/api360/concepts/routing.md
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.ru/dev/api360-preview/doc/ru/llms.txt

# Описание параметра `conditions` (условие проверки письма)

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

- **Поле** (_field_) — «что сравниваем»: какое-то свойство письма, которое требуется проверить.
- **Предикат** (_matcher_) — «как сравниваем»: операция сравнения (равно, не равно, содержит, существует и т. п.).
- **Образец** (_pattern_) — «с чем сравниваем»: строка-образец с которой осуществляется сравнение выбранного поля.

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

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

#|
|| **Условие** | **Примеры** ||
|| Значение поля `field1` равно `value1` *И* при этом значение `field2` соответствует `value2` (согласно предикату `operation`)
```json
{
  "field1": "value1",
  "field2": { "operation": "value2" }
}
```
|
```json
{
  "from": "friend@mail.ru",
  "attach:filename": "Квитанция.pdf"
}
```
||
|| Условия:

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

объединены в соответствии с `logic-operation` (*И* или *ИЛИ*)
```json
{
  "logic-operation": [
    { "field1": "value1" },
    { "field2": { "operation": "value2" } }
  ]
}
```
|
```json
{
  "$and": [
    { "from": "friend@mail.ru" },
    { "attach:filename": "Квитанция.pdf" }
  ]
}
```
```json
{
  "$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
```json
{ "field": { "$base64": "dmFsdWU=" } }
```
|
```json
{
  "address:from": {
    "$base64": "ZnJpZW5kQG1haWwucnU="
  }
}
```
||
|#


{% cut "Пример 1: 'От кого' совпадает c 'hello@ya.ru'" %}

`address:from=="hello@ya.ru"`
```json
{ "address:from": "hello@ya.ru" }
```

{% endcut %}

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

`address:from=="fromBase64('aGVsbG9AeWEucnU=')"`
```json
{ "from": { "$base64": "aGVsbG9AeWEucnU=" } }
```

{% endcut %}

{% cut "Пример 3: 'От кого' содержит '@yandex.ru' И в теме письма есть 'hello' ИЛИ 'bye'" %}

`address:from=="%@yandex.ru%" AND (header:subject=="%hello%" OR header:subject=="%bye%")`
```json
{
  "address:from": { "$contains": "@yandex.ru" },
  "subject": { "$contains": [ "hello", "bye" ] }
}
```

или

```json
{
  "$and": [
    { "address:from": { "$contains": "@yandex.ru" } },
    { "subject": { "$contains": { "$any": [ "hello", "bye" ] } } }
  ]
}
```

или

```json
{
  "$and": [
    { "address:from": { "$contains": "@yandex.ru" } },
    { "$or": [
      {"subject": { "$contains": "hello" } },
      { "subject": { "$contains": "bye"} }
    ] }
  ]
}
```

{% endcut %}

{% cut "Пример 4: Присутствует заголовок 'x-yandex-spam'" %}

`header:x-spam-flag EXISTS`

```json
{ "header:x-spam-flag": { "$exists": true } }
```

{% endcut %}

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

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

```json
{ "header:x-spam-flag": "yes" }
```

{% endcut %}

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

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

```json
{ "header:x-spam-flag": { "$ne": "yes" } }
```

{% endcut %}

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

```bnf
%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
```
