فهرست قانونها
همهٔ قانونهای روی connection، به همان ترتیبی که ارزیابی میشوند.
فراخوانی واقعی را با کلید خودتان روی فضای کاری شما اجرا میکند.
GET /rules
همهٔ قانونهای روی connection، به همان ترتیبی که ارزیابی میشوند.
یک قانون چگونه اجرا میشود
export OE=https://api.openemail.ukexport AUTH="Authorization: Bearer $OPENEMAIL_API_KEY"یک قانون فهرستی از شرطها روی پیام رسیده است و فهرستی از اقدامها برای هر چه با آنها تطبیق یابد. قانونها به connection تعلق دارند نه به کسی که یکیشان را نوشته است. کلید فضای کاری همان قانونهایی را میبیند که یک همکار میبیند، و حذف حساب نویسنده آنها را با خود نمیبرد.
هر connection ۱۰۰ قانون دارد، و هر کدام از آنها حداکثر ۲۰ شرط و ۱۰ اقدام. اینها محافظ در برابر اسکریپت افسارگسیختهاند نه محدودیت پلن: صد و یکمین قانون rule_limit_reached است، یک 422، و بیستویکمین شرط پیش از نوشتهشدن چیزی توسط اسکیما رد میشود.
match: "all" شرطها را با AND به هم میبندد، match: "any" با OR، و negate روی یک شرط همان NOT است. درخت بولین تودرتو وجود ندارد: (A and B) or C دو قانون است. این یک تصمیم است نه یک میانبر. اسکیمای بازگشتی را نمیتوان با $refStrategy: "none" در سند OpenAPI توصیف کرد، نمیتوان به صورت JSON Schema به کلاینت MCP داد، و دقیقاً همان شکلی است که پیشتر در این مخزن سقف نمونهسازی TypeScript را ترکانده است. دو قانون همچنین همان چیزی است که شش ماه بعد یک آدم میخواند.
هر قانون فعالِ روی connection در برابر هر پیام رسیده ارزیابی میشود، به ترتیب position و از کوچکترین. ارزیابی پس از قانونی که تطبیق یافته و stopProcessing: true دارد متوقف میشود، و هیچچیز پایینتر از آن اصلاً در نظر گرفته نمیشود. جایی که دو قانونِ تطبیقیافته هر دو پوشهای را نام ببرند، قانون بعدی برنده است و پیام در پوشهٔ آن مینشیند، که همان خوانشی است که یک فهرست شمارهدار به شما میدهد و تنها نکتهٔ ترتیب است که ارزش گفتن دارد و نباید به کشفشدن واگذارش کرد.
قانونها باز شکست میخورند. شرطی که کلاینتی قدیمیتر نوشته، مقداری که به الگو کامپایل نمیشود، پایگاهدادهای که پاسخ نمیدهد: هر کدام از اینها رد میشود و پیام همانگونه تحویل میشود که میشد، و خطا روی همان اجرا لاگ میشود. موتور قانونی که استثنا پرتاب کند یعنی پیامی که هرگز نمیرسد؛ موتور قانونی که رد شود یعنی یک پیام در پوشهٔ اشتباه.
هیچچیز عطف به ماسبق نمیشود. یک قانون تصمیم میگیرد با نامهای که پس از وجودش میرسد چه شود، و عمداً اندپوینتی نیست که آن را روی صندوق پستیای که همین حالا دارید اعمال کند. POST /rules/{id}/test را ببینید، که به پرسشی پاسخ میدهد که مردم وقتی سراغ آن میروند واقعاً میپرسند.
نمونه
نیازمند rules:read است. limit تا 100 میرود، cursor مبهم است (همان nextCursor را که گرفتهاید پس بفرستید)، و enabled به یک سوی کلید محدود میکند.
curl "$OE/rules?limit=25&enabled=true" -H "$AUTH"{ "object": "list", "data": [ { "object": "rule", "id": "rul_7f3a1c94e05d3862c1f0a44b", "name": "Receipts to their own label", "description": null, "enabled": true, "position": 0, "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": "2026-08-29T11:04:12.000Z", "matchCount": 148, "createdAt": "2026-08-01T09:00:00.000Z", "updatedAt": "2026-08-20T16:31:00.000Z" } ], "hasMore": false, "nextCursor": null}enabled رشتههای true و false را میگیرد نه بولینی که تبدیل شده باشد، و این وسواس نیست: Boolean("false") برابر true است، پس کوئری تبدیلشده به «قانونهای غیرفعالم را نشانم بده» با قانونهای فعال پاسخ میداد و به نظر میرسید کار کرده است.
ترتیب فهرست همان ترتیب ارزیابی است، پس خواندنش از بالا به پایین یعنی خواندن آنچه بر سر یک پیام میآید. position یکتا نیست و شناسه هم نیست (با POST /rules/reorder دوباره شمارهگذاری میشود)، پس یک قانون را با شناسهٔ rul_ آن پیدا کنید و هرگز با جایی که اکنون نشسته است.
matchCount و lastMatchedAt همانطور که نامه میرسد در پایگاهداده شمرده میشوند نه اینکه خوانده و بازنویسی شوند، پس دو پیامی که همزمان مینشینند نمیتوانند شمارشی را میان خود گم کنند. قانونی که هرگز عمل نکرده 0 و null میخواند، و وقتی کسی میگوید قانونی کار نمیکند همین پاسخی است که ارزش عملکردن دارد.