پرش به مستندات
Python

تایپ‌ها و کمک‌کننده‌ها

پکیج دیگر چه چیزهایی را 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_base64Base64 برای بایت‌های پیوست، از 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، اینجا همتایی ندارند.

typed.py
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 انتظار برود آن را می‌پذیرند.

constants.py
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 پایه، تایم‌اوت و سیاست تلاش دوبارهٔ کلاینت.

escape_hatch.py
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 آن، با آرگومان‌های یکسان و با تنظیم همهٔ گزینه‌ها، اجرا می‌کند و هر جا متدی غایب باشد، گزینه‌های متفاوتی بگیرد، درخواست متفاوتی بفرستد یا مقدار متفاوتی برگرداند شکست می‌خورد.