کلیدهای API
`keys.list`، `list_all`، `iterate`، `get`، `create`، `update`، `delete`، `rotate` و `revoke`، بههمراه خوانندههای گزارش درخواستها و فعالیت.
همهٔ متدها
from pathlib import Path from openemail import openemail key = openemail.keys.create({ 'name': 'Billing sender', 'scopes': ['emails:send'], 'domainAllowlist': ['billing.acme.com'], 'expiresInMinutes': 60 * 24 * 90,}) secret = Path('.openemail-billing-key')secret.touch(mode=0o600)secret.write_text(key['token']) openemail.keys.update(key['id'], {'enabled': False}) rotated = openemail.keys.rotate(key['id'])secret.write_text(rotated['token']) openemail.keys.revoke(key['id'], {'reason': 'Replaced'})openemail.keys.delete(key['id'])create و rotate تنها فراخوانیهاییاند که رمزی را، در token، یک بار برمیگردانند. هر خواندنی بهجای آن maskedKey برمیگرداند. update کلید را با enabled خاموش و روشن میکند، که جایگزین برگشتپذیر revoke است، و delete فقط کلیدی را برمیدارد که باطل شده باشد. خواندن به keys:read و هر تغییر به keys:manage نیاز دارد.
کلاینت هرگز create یا rotate را دوباره تلاش نمیکند. تلاش دوباره پس از یک پاسخ گمشده کلید دومی میسازد، یا secret ای را که تلاش نخست برگردانده بود باطل میکند. update و revoke مثل خواندنها دوباره تلاش میشوند، چون تکرارشان همان کلید را باقی میگذارد، و delete نه.
هرگز گستردهتر از فراخوان
یک کلید هرگز کلیدی گستردهتر از خودش نمیسازد و به آن نمیرسد: اسکوپها، نقش، انقضا، حالت و دامنهٔ ارسال باید همه درون کلید فراخوان بمانند، وگرنه فراخوانی با 403 beyond_caller_authority رد میشود. کلیدی که به برخی دامنهها یا نشانیها محدود شده فقط کلیدهای درون دامنهٔ ارسال خودش را میبیند. rotate روی خود کلید فراخوان با keys:write هم کار میکند، مانند me.rotate().
تأیید دوباره را نمیتوان روی فراخوانیای که با کلید انجام میشود اعمال کرد، پس keys:manage اعتباری است که اعتبار میسازد. آن را فقط به خودکارسازیای بدهید که کلید صادر میکند، به آن کلید نقش، دامنهٔ ارسال و انقضا بدهید و list_workspace_activity را زیر نظر بگیرید؛ هر کاری که میکند آنجا به نام خودش ثبت میشود.
گزارش درخواستها و فعالیت
from datetime import datetime, timedelta, timezone from openemail import openemail failures = openemail.keys.list_requests( '4c1b257a66287fd113bd89d0', failed_only=True, since=datetime.now(timezone.utc) - timedelta(days=1),)for request in failures['items']: print(request['status'], request['method'], request['path']) for change in openemail.keys.iterate_workspace_activity(): actor = change['actor'] print(change['keyName'], change['type'], actor['label'] if actor else None)list_requests و list_activity یک کلید را میخوانند، list_workspace_requests و list_workspace_activity همهٔ کلیدها یا آنهایی را که key_ids نام میبرد، و کنار هرکدام یک list_all_… و یک iterate_… هست. since و until را میپذیرند و خوانندههای درخواستها failed_only را هم میپذیرند.
since و until یک datetime یا رشتهٔ ISO 8601 میگیرند. یک datetime به وقت UTC فرستاده میشود، و نوع naive آن اول به وقت محلی خوانده میشود.
مرجع
keys.list()مرجع کاملkeys.list_all()مرجع کاملkeys.iterate()مرجع کاملkeys.get()مرجع کاملkeys.create()مرجع کاملkeys.update()مرجع کاملkeys.delete()مرجع کاملkeys.rotate()مرجع کاملkeys.revoke()مرجع کاملkeys.list_requests()مرجع کاملkeys.list_all_requests()مرجع کاملkeys.iterate_requests()مرجع کاملkeys.list_activity()مرجع کاملkeys.list_all_activity()مرجع کاملkeys.iterate_activity()مرجع کاملkeys.list_workspace_requests()مرجع کاملkeys.list_all_workspace_requests()مرجع کاملkeys.iterate_workspace_requests()مرجع کاملkeys.list_workspace_activity()مرجع کاملkeys.list_all_workspace_activity()مرجع کاملkeys.iterate_workspace_activity()مرجع کامل