تایپها و کمککنندهها
پکیج دیگر چه چیزهایی را export میکند.
خروجیهای زمان اجرا
| خروجی | چیست |
|---|---|
| init, openemail | کلاینت مشترک را یک بار پیکربندی کنید، سپس هر جا خواستید openemail را import کنید. اگر init هرگز اجرا نشود، خودش را از OPENEMAIL_API_KEY میسازد. |
| get_client, reset_client | خودِ کلاینت مشترک، و راهی برای کنار گذاشتنش تا فراخوانی بعدی یکی تازه بسازد، که همان چیزی است که یک تست بین کیسها میخواهد. |
| OpenEmail, create_client | یک کلاینت جداگانه. OpenEmail() هر چیزی را که ندهید از محیط میخواند، و create_client نام دیگری برای آن است. |
| AsyncOpenEmail | همان کلاینت که هر متدش با await فراخوانی میشود، روی asyncio یا trio. |
| create_temp_mail, create_async_temp_mail | کلاینت صندوق یکبارمصرف که هیچ کلید API با خود ندارد، و همتای ناهمگامش. |
| OpenEmailError، OpenEmailApiError، OpenEmailNetworkError، WebhookVerificationError | خطاهایی که پکیج raise میکند، همه زیر OpenEmailError. OpenEmailApiError پاسخ خطای تجزیهشده را بهصورت body با خود دارد، و وقتی ثبتنام در یک فرم رد شده باشد، fields را هم. |
| verify_webhook_signature | با زمان ثابت، بههمراه یک پنجرهٔ بازپخش. payload تجزیهشده را برمیگرداند و در هر شکستی WebhookVerificationError را raise میکند. |
| to_base64 | Base64 برای بایتهای پیوست، از bytes، bytearray یا memoryview. |
| is_api_key | اینکه یک رشته شکل oe_live_ یا oe_test_ دارد یا نه. بررسی شکل است، نه اثبات اینکه کلید هنوز کار میکند. |
| is_access_token | اینکه یک رشته شکل توکن دسترسی OAuth را دارد یا نه: 1 تا 512 نویسه، بیآنکه با oe_ شروع شود. |
| is_sealed, MESSAGE_ENCRYPTION_FORMATS | اینکه بدنهٔ یک پیام متن رمز است یا نه، و پنج پاکتی که ingest میتواند نام ببرد. is_sealed برای دو قالب SIGNED برابر false است، چون بدنهٔ آنها بدون رمز رسیده است، و دقیقاً به همین دلیل عرضه میشود بهجای آنکه استخراجش از union به عهدهٔ فراخوان بماند. |
| LANGUAGES، resolve_language، language_by_code، is_rtl_language | جدول زبانهای همراه پکیج، و جستوجوهایی که یک انتخابگر زبان لازم دارد. |
| API_SCOPES | واژگان اسکوپها، برای صفحهٔ ساخت کلید. |
| WEBHOOK_EVENTS, WEBHOOK_SIGNATURE_HEADERS | رویدادهایی که یک اندپوینت میتواند مشترکشان شود، و نام هدرهایی که یک تحویل با خود دارد. |
| RULE_FIELDS، RULE_OPERATORS، RULE_ACTIONS | واژگانی که شرطها و کنشهای یک قاعده از آن ساخته میشوند. |
| PAGE_LIMITS | بیشینه و پیشفرض limit روی بیشتر فهرستهای صفحهبندیشده: 100 و 25. contacts.list، audiences.list_contacts و فهرستهای tracking تا 200 را با پیشفرض 50 میپذیرند، و temp_mail.list_messages تا 50 را میپذیرد. |
| ERROR_TYPES | واژگان ثابت خطاها. |
| VERSION, __version__ | نسخهٔ پکیج. |
| THREAD_SORTS، PEOPLE_SORTS، CONTACT_THREAD_SORTS، FILE_SORTS | ترتیبهایی که فهرستهای رشتهها، افراد، رشتههای مخاطب و فایلها میتوانند بر اساس آنها مرتب شوند. |
| FILE_KINDS، FILE_DIRECTIONS، CONTACT_BLOCK_LISTS، CONTACT_PHOTO_TYPES | پالایههای فهرست فایلها، دو فهرست مسدودی فضای کاری، و نوعهای تصویری که عکس یک مخاطب میتواند داشته باشد. |
| BROADCAST_STATUSES، BROADCAST_RECIPIENT_FILTERS، SUPPRESSION_REASONS، WEBHOOK_REPLAY_ERROR_CODES | یک ارسال گروهی در چه وضعیتی است، کدام نسخههایش فهرست شوند، چرا یک نشانی مسدود شده است، و چرا بازپخش یک webhook رد شد. |
| PROVIDER_IMPORT_RESOURCES، PROVIDER_IMPORT_STATUSES، PROVIDER_IMPORT_DOMAIN_STATES | یک ایمپورت از ارائهدهنده چه چیزهایی را میتواند منتقل کند، یک اجرا در چه وضعیتی است، و هر دامنهای که یافته در چه وضعیتی است. |
| FILE_USAGES | چرا فایلی به جای حذفشدنی بودن نگه داشته میشود: received، sent، linked یا scheduled. |
| CREDENTIAL_KINDS، STEP_UP_METHODS، STEP_UP_ERROR_CODES | اینکه me.get() و me.ping() کدام اعتبار را توصیف میکنند (apiKey یا oauth)، کد تأیید هویت چطور بررسی میشود (email یا totp)، و کدهایی که تأیید ممکن است با آنها شکست بخورد. |
| FORM_STATUSES، FORM_SUBMISSION_STATUSES، FORM_FIELD_TYPES، FORM_STARTER_SLUGS، FORM_* | مقدارهایی که یک فرم، فیلدهایش و ثبتنامهایش میگیرند، در شانزده مجموعه: وضعیتها، نوعهای فیلد، نقطههای شروع، قلمها، پهناها، و دلیلهایی که یک جواب به خاطرشان رد میشود. |
| BILLING_*، BRAND_*، DNS_*، DOMAIN_* و مجموعههای دیگر | مقدارهای هر فضای نام دیگر، که هر مجموعه به نام چیزی که در خود دارد نامگذاری شده است. |
تایپها
هر درخواست و پاسخی یکی دارد، یک TypedDict در openemail.types با همان نامی که همتای TypeScript آن دارد. …Resource همان چیزی است که API برمیگرداند، و …Create، …Patch، …Input و …Send آن چیزیاند که شما میدهید. فیلترها و گزینههای هر فراخوانی آرگومانهای کلیدواژهای هستند، پس تایپهای TypeScript که آنها را حمل میکنند، مانند EmailListOptions، اینجا همتایی ندارند.
from openemail.types import EmailSend, Page, SentEmailResource, ThreadSummaryResource message: EmailSend = { 'from': 'Acme Billing <[email protected]>', 'to': '[email protected]', 'replyTo': '[email protected]', 'subject': 'Your September invoice', 'text': 'Your invoice is attached.',} sent: SentEmailResource = client.emails.send(message)inbox: Page[ThreadSummaryResource] = client.threads.list(folder='inbox') print(sent['status'], sent['scheduledAt'], inbox['nextCursor'])کلیدها همان نامهای camelCase فیلدهای خودِ API هستند، مانند 'replyTo'، 'scheduledAt' و 'nextCursor'، هم در آنچه میفرستید و هم در آنچه برمیگردد. فقط آرگومانهای یک متد snake_case هستند (idempotency_key=، label_ids=)، و آرگومانی که قرار بود from نام بگیرد from_= است، مانند emails.list و calendar.list_events.
mypy و pyright هر دو آنها را میخوانند، پس کلیدی که غلط نوشته شده بهجای رسیدن به API در بررسی نوع شکست میخورد. mypy برای یک بدنه Extra key "replyto" for TypedDict "EmailSend" و برای یک پاسخ TypedDict "SentEmailResource" has no key "satus" را گزارش میکند، و pyright همین را به زبان خودش میگوید. مقداری بیرون از یک مجموعه هم به همین شکل شکست میخورد، مانند status='sending-ish' روی emails.list.
اینها برای بررسیکنندهٔ نوع شما وجود دارند. در زمان اجرا هر TypedDict یک dict ساده است، پس import کردنش هزینهای ندارد و هنگام اجرای برنامه چیزی بررسی نمیشود.
- کلاینت:
Page،ApiKeyMode،RawBody.openemail.types.clientاینها را هم میافزاید:AccessTokenProvider،AsyncAccessTokenProvider،HeaderValueوQueryValue. - خطاها:
ErrorType،FormFieldProblem. - ایمیلها:
EmailSend،EmailTranslate،EmailResource،SentEmailResource،EmailRecipientResource،EmailEventResource،EmailStatus،EmailSource،EmailTransport،EmailTrackingSummary،EmailTranslationResource،TranslationResource،RecipientStatus،BatchItemResource،BatchResultResource. - قالبها:
TemplateCreate،TemplatePatch،TemplateContent،TemplatePreviewInput،TemplateSend،TemplateResource،TemplateDetailResource،TemplateVersionResource،TemplatePreviewResource،TemplateSendsResource،SentTemplateEmailResource،DeletedTemplateResource،TemplateEngine،TemplateProp،TemplateSlot،TemplateStatus،TemplateValueKind. - ردیابی:
TrackingResource،TrackingSummary،TrackingRecipientResource،TrackingLinkResource،TrackingOpenResource،TrackingClickResource،TrackingStatsResource،TrackingGrain. - رشتهها و پیشنویسها:
ThreadPatch،ThreadResource،ThreadSummaryResource،UpdatedThreadResource،TrashedThreadResource،SnoozedThreadResource،DraftInput،DraftResource،DraftSummaryResource،SavedDraftResource،DeletedDraftResource. - برچسبها، مخاطبان، دامنهها و نشانیها:
LabelInput،LabelColor،LabelResource،DeletedLabelResource،ContactCreate،ContactPatch،ContactSource،ContactResource،ContactDetailResource،ContactAudienceResource،ContactAudiencesSet،DeletedContactResource،PeoplePage،PersonResource،DomainPatch،DomainResource،DomainDetailResource،DomainSendingState،DomainTracking،DomainTrackingState،AddressBookPage،AddressBookResource،AddressResource،SendableDomainResource. - گروههای مخاطب:
AudienceCreate،AudiencePatch،AudienceMemberSort،AudienceContactAdd،AudienceContactsBatch،AudienceImport،AudienceImportRow،AudienceResource،AudienceBuiltin،AudienceContactResource،AudienceMemberResource،RemovedAudienceContactResource،DeletedAudienceResource،EmptiedAudienceResource،AudienceBatchAddResource،AudienceBatchRemoveResource،AudienceImportResource،AudienceGrowthResource،AudienceGrowthTotals،AudienceGrowthSeries،AudienceGrowthBucket. - ارسالهای گروهی:
BroadcastCreate،BroadcastPreviewInput،BroadcastResource،BroadcastCounts،BroadcastStatus،BroadcastPreviewResource،BroadcastRecipientResource،BroadcastRecipientContentResource،BroadcastRecipientFilter،BroadcastStatsResource،BroadcastStatsTotals،BroadcastStatsBucket. - قواعد:
RuleCreate،RulePatch،RuleTestInput،RuleResource،RuleRunResource،RuleTestResource،DeletedRuleResource،RuleCondition،RuleConditionInput،RuleAction،RuleActionType،RuleField،RuleOperator. - وبهوکها:
WebhookCreate،WebhookPatch،WebhookResource،CreatedWebhookResource،DeletedWebhookResource،WebhookDeliveryResource،WebhookDeliveryDetailResource،WebhookDeliveryAttempt،WebhookReplayResource،WebhookReplayRefusal،WebhookReplayErrorCode،WebhookTestResource،WebhookEvent،WebhookPayload،EmailOpenedData،EmailClickedData،EmailDownloadedData،FileEventData. - تقویم و تنظیمات:
CalendarOccurrenceResource،CalendarEventResource،CalendarAttendeeResource،SettingsPatch،SettingsResource. - نقشها، اعضا و کلیدها:
RoleCreate،RolePatch،RoleResource،DeletedRoleResource،PermissionResource،MemberAdd،MemberPatch،MemberAddressGrant،MemberResource،MemberAddressResource،RemovedMemberResource،MemberAccess،KeyResource،PingResource. - صندوقهای یکبارمصرف:
TempInboxCreate،TempInboxResource،CreatedTempInboxResource،DeletedTempInboxResource،TempDomainResource،TempMessageResource،TempMessagesResource،TempMessageDetailResource،DeletedTempMessageResource. - مشترک:
RecipientInput،AttachmentInput،AttachmentResource،MessageResource،MessageEncryption،MessageEncryptionFormat،TrackingRequest،TranslateOptions،SendTranslateOptions،LanguageResource،ApiScope،Permission،BuiltinRole،HitKind. - توکنهای دسترسی و کدهای تأیید هویت:
CredentialKind،ApiKeySelfResource،OauthTokenSelfResource،ApiKeyPingResource،OauthTokenPingResource،StepUpBegin،StepUpVerify،StepUpMethod،StepUpErrorCode،StepUpStatusResource،StepUpChallengeResource،StepUpVerifiedResource. - فرمها:
FormCreate،FormPatch،FormResource،FormDetailResource،FormDocument،FormField،FormCopy،FormStyle،FormSettings،FormSettingsInput،FormStats،FormAudience،FormStarterResource،FormStarterDetailResource،FormAnalyticsResource،FormSubmissionResource،FormAnswer،ResentFormConfirmationResource،FormSubscribeValues،FormSubscriptionResource،FormSubmittedEventData،FormConfirmedEventData. - هر چیز دیگری که API برمیگرداند، از صورتحساب تا فضاهای کاری، تایپهایش را با همین نامها دارد.
مجموعههای رشتهای
مجموعههای مقدار، ثابتهایی در openemail.constants هستند که هر کدام به نام چیزی که در خود دارد نامگذاری شده، با یک attribute برای هر مقدار: EMAIL_STATUSES.SENT برابر 'sent' است. برای گرفتن همهٔ مقدارها روی یک مجموعه پیمایش کنید، مقداری را که از بیرون آمده با in بررسی کنید، و با len() بشمارید. هر عضو با Final تایپ شده است، پس mypy و pyright مقدار EMAIL_STATUSES.SENT را همان literal 'sent' میخوانند و هر جا که یک EmailStatus انتظار برود آن را میپذیرند.
from openemail import PAGE_LIMITS, WEBHOOK_EVENTSfrom openemail.constants import EMAIL_STATUSES failed = client.emails.list(status=EMAIL_STATUSES.FAILED, limit=PAGE_LIMITS.MAX_LIMIT) print(EMAIL_STATUSES.SENT, list(EMAIL_STATUSES), len(WEBHOOK_EVENTS))print('email.opened' in WEBHOOK_EVENTS, len(failed['items']))خودِ openemail تعداد 108 ثابت را export میکند: VERSION، LANGUAGES، PAGE_LIMITS، PAY_AS_YOU_GO_LIMITS_CENTS و 104 مجموعه، همانهایی که یک برنامه بیش از همه سراغشان میرود. بقیه، مانند EMAIL_STATUSES و TEMPLATE_STATUSES، را از openemail.constants import کنید، جایی که همهٔ مجموعهها قرار دارند.
اندپوینتی که این هنوز پوششش نمیدهد
یک انتشار SDK هرگز نباید چیزی باشد که میان شما و اندپوینتی که از پیش کار میکند بایستد. client.raw.request() یک مسیر و آرگومانهای کلیدواژهای میگیرد و بدنهٔ تجزیهشده را برمیگرداند، با اعمال اعتبارنامه، URL پایه، تایماوت و سیاست تلاش دوبارهٔ کلاینت.
result = client.raw.request( '/something-new', method='POST', query={'dryRun': True}, body={'name': 'Invoices'}, repeatable=True,) print(result)یک GET مثل هر خواندن دیگری دوباره تلاش میشود. هر متد HTTP دیگری یک بار فرستاده میشود مگر آنکه repeatable=True بدهید، که ادعای شماست مبنی بر اینکه میتوان آن را دو بار فرستاد. query مقدارهایی را که None یا خالی هستند رد میکند، و api_key= و timeout= همانطور کار میکنند که روی هر متد دیگری. روی AsyncOpenEmail فراخوانی با await انجام میشود.
مسیر باید با یک / تنها آغاز شود. هر چیز دیگری، و مسیری که URL نهاییاش از origin مربوط به API بیرون برود، پیش از فرستادن درخواست ValueError را raise میکند، تا اعتبارنامه هرگز به میزبان دیگری نرسد.
کارهایی که عمداً انجام نمیدهد
- هیچ بدنهٔ درخواستی را اعتبارسنجی نمیکند. اسکیمای سرور تنها نسخهٔ قواعد است، و نسخهٔ دومی اینجا سرانجام آدرسی را رد میکرد که سروری تازهتر میپذیرد، آن هم در نسخهای که کسی دو سال پیش pin کرده است.
- به
httpx،anyioوtyping-extensionsوابسته است، و به هیچ چیز دیگری. - در مسیر خروج فقط چیزی را تبدیل میکند که JSON نمیتواند همانطور که هست حمل کند:
bytesدرcontentیک پیوست به base64 تبدیل میشود، یکdatetimeبه یک لحظهٔ ISO 8601 به وقت UTC، یکdateبه یک تاریخ ISO و یکsetبه یک فهرست. یک گیرندهٔ تنها درto،ccیاbccدر یک فهرست پیچیده میشود. - پاسخ را تنها به یک شکل بازآرایی میکند: آرایهٔ
dataدر یک مجموعه از پاکتش بیرون کشیده میشود. یک فهرست صفحهبندیشده آن را بهصورتitemsکنارhasMoreوnextCursorبازمیگرداند،contacts.list_peopleبهصورتitemsکنارhasMore،nextCursorوseen،emails.send_batchبهصورتitemsکنارsentوfailed،templates.list_sendsبهصورتitemsکنارtotal،pageوpageSize،temp_mail.list_messagesبهصورتitemsکنارhasMore،nextCursorوexpiresAt، وaddresses.listبهصورتaddressesکنارunrestricted،domains،hasMoreوnextCursor.imports.list_failuresتنها فهرستی است که همانطور که API میفرستد باقی میماند، یعنی{'object': ..., 'data': [...], 'nextCursor': ...}. در همهجای دیگر یک فهرست ساده است. هر منبعی درون آن شکل مستندشدهٔ HTTP خود را نگه میدارد.
بررسی همخوانیِ پکیج این را صادق نگه میدارد. هر متد را کنار همتای TypeScript آن، با آرگومانهای یکسان و با تنظیم همهٔ گزینهها، اجرا میکند و هر جا متدی غایب باشد، گزینههای متفاوتی بگیرد، درخواست متفاوتی بفرستد یا مقدار متفاوتی برگرداند شکست میخورد.