Vytvoření pravidla
Na jedné straně podmínky, na druhé akce. Zapnuto, pokud neřeknete jinak.
Spustí skutečné volání proti vašemu pracovnímu prostoru, s vaším vlastním klíčem.
POST /rules
Na jedné straně podmínky, na druhé akce. Zapnuto, pokud neřeknete jinak.
Příklad
Vyžaduje rules:write. Vrací 201. position se nepřijímá. Nové pravidlo se připojí na konec seznamu a přesouvá se přes POST /rules/reorder.
curl -X POST "$OE/rules" -H "$AUTH" -H "Content-Type: application/json" \ -d '{ "name": "Receipts to their own label", "match": "all", "conditions": [ { "field": "from_domain", "op": "matches", "value": "*.stripe.com" }, { "field": "subject", "op": "contains", "value": "receipt" } ], "actions": [ { "type": "label", "value": "USER_RECEIPTS" }, { "type": "archive" } ], "stopProcessing": true }'{ "object": "rule", "id": "rul_7f3a1c94e05d3862c1f0a44b", "name": "Receipts to their own label", "description": null, "enabled": true, "position": 3, "match": "all", "conditions": [ { "field": "from_domain", "op": "matches", "value": "*.stripe.com", "negate": false }, { "field": "subject", "op": "contains", "value": "receipt", "negate": false } ], "actions": [ { "type": "label", "value": "USER_RECEIPTS" }, { "type": "archive" } ], "stopProcessing": true, "lastMatchedAt": null, "matchCount": 0, "createdAt": "2026-08-30T10:41:02.000Z", "updatedAt": "2026-08-30T10:41:02.000Z"}Pravidlo vytvořené tudy je ZAPNUTÉ a začne působit na další zprávu. To je správné výchozí chování pro volání, které někdo udělal záměrně, a je to opak nástroje createRule v MCP, který totéž pravidlo zapíše VYPNUTÉ, protože model, který se rozhodne archivovat poštu, by neměl archivovat dřív, než si pravidlo přečte člověk.
Duplicitní name na témže spojení je rule_name_taken, 409. Podle jmen se pravidlo pozná v záznamu běhů i na obrazovce nastavení, takže dvě pravidla jménem „Newsletters“ jsou report, který nikdo nepřečte.
101. pravidlo je rule_limit_reached, 422. Strop je pojistka proti skriptu ve smyčce, ne účetní hranice, a není zamčený. Dvě vytvoření závodící při 99 mohou uspět obě.
Na co se podmínka může zeptat
Podmínka je { field, op, value }, s volitelným header, který pojmenovává hlavičku ke čtení, a volitelným negate. value je na drátě VŽDY string. Číselná pole se porovnávají jako čísla po Number(value) a dvě booleovská pole berou doslovné řetězce "true" a "false", protože jedno pole s jedním typem je schéma, které generátor OpenAPI popsat umí, zatímco sjednocení tří ne.
| Pole | Co čte | Operátory |
|---|---|---|
| `from` | Hlavička From:, normalizovaná stejně, jako ji normalizuje blocklist. | text |
| `from_domain` | Doména z From: a její NADŘAZENÉ domény až po dvě části: zpráva z mail.corp.example.com odpovídá i corp.example.com a example.com, ale pro com neodpovídá ničemu. | text |
| `envelope_from` | SMTP MAIL FROM. Na každém mailing listu se liší od from a je to jediná identita, proti které se smí napsat reject. | text |
| `to`, `cc`, `bcc` | Kterákoli jedna adresa v dané hlavičce. | text |
| `recipient` | Kterákoli adresa v to, cc nebo bcc: zkratka pro všechny tři. | text |
| `reply_to` | Hlavička Reply-To. | text |
| `delivered_to` | Kanonická adresa, na kterou byla tato kopie doručena, bez plus-tagu a převedená na malá písmena — právě tak se porovnává catch-all alias. | text |
| `subject` | Řádek předmětu tak, jak přišel. | text |
| `body` | Textová část, nebo HTML zredukované na text. Omezeno stropem, takže tělo o 20 MB se neprochází celé. | text |
| `header` | Libovolná hlavička, pojmenovaná ve vlastním poli header dané podmínky. Tam je povinné a před porovnáním se převede na malá písmena. | text |
| `list_id` | Hlavička List-Id: značka, kterou se mailing list identifikuje. | text |
| `attachment_name` | Název souboru libovolné přílohy. | text |
| `attachment_type` | MIME typ libovolné přílohy, např. application/pdf. | text |
| `has_attachment` | Zda vůbec nějaká je. | equals "true" / "false" |
| `spam` | Verdikt o spamu, ke kterému došla doručovací cesta, ještě než se spustila vaše pravidla. | equals "true" / "false" |
| `attachment_size` | Velikost přílohy v bajtech. Porovnání odpovídá, když ho splní kterákoli jedna příloha. | gt, lt, equals |
| `message_size` | Celá zpráva na drátě, v bajtech. | gt, lt, equals |
| `hour` | Hodina doručení, 0–23, UTC. | gt, lt, equals |
| `weekday` | Den doručení, 0–6, neděle je 0, UTC. | gt, lt, equals |
| Operátor | Co dělá |
|---|---|
| `matches` | Glob, a nic než glob: * pro libovolný úsek znaků, ? pro jeden. Žádné regulární výrazy. Vzor od API klienta běží na doručovací cestě a katastrofálně zpětně navracející vzor tam znamená schránku, která přestane přijímat. |
| `contains` | Podřetězec, bez ohledu na velikost písmen. |
| `equals` | Celá hodnota, bez ohledu na velikost písmen. U číselného pole číselná rovnost. |
| `starts_with` | Prefix, bez ohledu na velikost písmen. |
| `ends_with` | Sufix, bez ohledu na velikost písmen. |
| `gt`, `lt` | Číselné, jen na čtyřech číselných polích. Textové pole s gt neodpovídá nikdy. |
Vzor pro matches musí nést aspoň dva vlastní alfanumerické znaky, tutéž laťku uplatňuje blocklist. Holá * se odmítne už při zápisu, místo aby se přijala a pak potichu odpovídala každé zprávě, která kdy přijde — to už není pravidlo, to je výpadek.
Podmínka, na kterou engine neumí odpovědět (neznámé pole od novějšího klienta, vzor, který se nezkompiluje, contains ""), se bere jako otázka, která nikdy nezazněla, ne jako nepravda, a negate ji neobrátí. Ten rozdíl je nosný: negovaná rozbitá podmínka brána jako nepravda by své pravidlo spustila na každou zprávu ve schránce. equals "" se respektuje, protože „řádek předmětu je prázdný“ je skutečná otázka.
Co pravidlo umí udělat
| Akce | `value` | Co se stane |
|---|---|---|
| `label` | id štítku | Přidá štítek. Id ve tvaru USER_… dává GET /labels. |
| `remove_label` | id štítku | Odebere ho. Uvedení téhož štítku v obou se vyřeší dřív, než se zpráva zařadí, místo aby záleželo na tom, co běželo naposled. |
| `archive` | žádná | Zařadí ji mimo doručenou poštu. |
| `mark_read` | žádná | Zahodí UNREAD. |
| `star` | žádná | Přidá STARRED. |
| `spam` | žádná | Zařadí ji do složky Spam. |
| `trash` | žádná | Zařadí ji do složky Trash a smaže štítky, které zpráva v koši nedrží. |
| `forward` | adresa | Pošle kopii dál. Než to použijete, přečtěte si poznámku níže. |
| `reply` | id nebo slug šablony | Odpoví automaticky publikovanou šablonou, s výhradou pojistky proti smyčce níže. |
| `block_sender` | žádná | Přidá odesílatele na blocklist, takže další zpráva je odmítnuta hned ve dveřích. |
| `reject` | žádná | Odmítne zprávu už při SMTP s 550 5.7.1 Message refused by the recipient. Jen obálka. Viz níže. |
reject se při zápisu odmítne, pokud totéž pravidlo nenese aspoň jednu podmínku envelope_from: reject_needs_envelope, 422. 550 odpovídá tomu, kdo nám zprávu předal, a na mailing listu je to LIST, který odmítnutí přečte jako odběratele, kterému se pošta vrací, a odhlásí čtenáře z něčeho, kde chtěl jen umlčet jednoho člověka. I když je podmínka napsaná, shoda, která vznikla jen z identit v hlavičkách, se sníží na zařazení do složky Spam, protože obálka je jediná identita, proti které se dá odmítnutí poctivě mířit.
forward řízený pravidlem odchází odesílací cestou, která zprávu ZNOVU POSTAVÍ: původní podpis DKIM to nepřežije a nepřežijí to ani exotické části, neobvyklé hlavičky a cokoli nad stropem velikosti odchozí pošty, který zpráva o 25 MB s přílohami překročí. Je to kopie toho, co přišlo, ne ta zpráva, co přišla. Adresa se kontroluje při zápisu pravidla, takže neověřený cíl je 422 na tom volání, ne pravidlo, které potichu zahazuje každou desátou zprávu.
reply neodpoví stroji. Potlačí se, když zpráva nese Auto-Submitted (jiné než no), Precedence: bulk|list|junk, List-Id, List-Unsubscribe, X-Autoreply nebo X-Autorespond, když je odesílatel v obálce prázdný (tvar, který má každý bounce), a když se hlavičky vůbec nepodařilo přečíst. Navíc jeden odesílatel dostane z dané schránky nejvýš jednu automatickou odpověď za 24 hodin. Dvě schránky s pravidly pro odpověď a bez pojistky si píšou navzájem, dokud si toho někdo nevšimne.