ドキュメント本文へスキップ
Python

型とヘルパー

パッケージがその他に公開しているもの。

ランタイムのエクスポート

エクスポート内容
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_mailAPI キーを持たない使い捨て受信箱用のクライアントと、その非同期版。
OpenEmailError、OpenEmailApiError、OpenEmailNetworkError、WebhookVerificationErrorパッケージが送出するエラーで、すべて OpenEmailError の下にある。OpenEmailApiError は、パース済みのエラーレスポンスを body として持ち、フォームの登録が拒否されたときは fields も持つ。
verify_webhook_signature一定時間で比較し、リプレイ許容ウィンドウを備える。パース済みのペイロードを返し、失敗時には WebhookVerificationError を送出する。
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メッセージの本文が暗号文かどうかと、受信処理が識別できる 5 種類のエンベロープ。署名のみの 2 形式は本文が平文で届いているため is_sealed は false になる。呼び出し側にユニオンから導出させるのではなく、この関数を同梱しているのはそのためである。
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ファイル一覧の絞り込み条件、ワークスペースの 2 つのブロックリスト、そして連絡先の写真に使える画像形式。
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_CODESme.get() と me.ping() が表す資格情報の種類(apiKey または oauth)、確認コードの確認方法(email または totp)、そして確認が失敗するときのコード。
FORM_STATUSES、FORM_SUBMISSION_STATUSES、FORM_FIELD_TYPES、FORM_STARTER_SLUGS、FORM_*フォーム、そのフィールド、その登録が取る値を 16 のセットにまとめたもの。ステータス、フィールドの種類、ひな形、フォント、幅、そして回答が拒否される理由です。
BILLING_*、BRAND_*、DNS_*、DOMAIN_* とその他のセットその他すべての名前空間の値。各セットは保持する内容にちなんで名付けられている。

型

すべてのリクエストとレスポンスに型があり、それは対応する TypeScript の型と同じ名前を持つ、openemail.types の TypedDict である。…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'])

キーは、送るものでも返ってくるものでも、'replyTo'、'scheduledAt'、'nextCursor' のような API 自身の camelCase のフィールド名である。snake_case になるのはメソッドの引数(idempotency_key=、label_ids=)だけで、from という名前になるはずの引数は、emails.list や calendar.list_events のように from_= になる。

mypy と pyright のどちらもこれらを読むので、綴りを誤ったキーは API に届く前に型チェックで失敗する。mypy は、ボディについては Extra key "replyto" for TypedDict "EmailSend"、レスポンスについては TypedDict "SentEmailResource" has no key "satus" と報告し、pyright も独自の表現で同じことを伝える。emails.list での status='sending-ish' のように、セットにない値も同じように失敗する。

これらは型チェッカーのためにある。実行時にはどの 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。
  • Webhook: 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 にある定数で、それぞれ保持する内容にちなんで名付けられ、値ごとに属性を持つ。たとえば EMAIL_STATUSES.SENT は 'sent' である。すべての値を得るにはセットをイテレートし、外部から来た値は in で確認し、個数は len() で数える。各メンバーは Final として型付けされているので、mypy と pyright は EMAIL_STATUSES.SENT をリテラル '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 個で、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 は他の読み取りと同様にリトライされる。それ以外のメソッドは、2 回送信されてもよいという宣言である repeatable=True を渡さないかぎり 1 回だけ送信される。query は値が None または空の項目を除外し、api_key= と timeout= は他のすべてのメソッドと同じように動作する。AsyncOpenEmail では呼び出しを await する。

パスは 1 つの / で始まる必要がある。それ以外のパスや、完成した URL が API のオリジンから外れるパスは、リクエストが送られる前に ValueError を送出するので、認証情報が別のホストに届くことはない。

あえて行わないこと

  • リクエストボディの検証は行わない。ルールの唯一の写しはサーバーのスキーマであり、ここに 2 つ目の写しを置けば、いずれ 2 年前に誰かが固定したバージョンが、新しいサーバーなら受け入れるアドレスを拒否することになる。
  • 依存するのは httpx、anyio、typing-extensions だけで、それ以外には何にも依存しない。
  • 送信時に変換するのは、JSON がそのままでは表せないものだけである。添付ファイルの content にある bytes は base64 に、datetime は UTC の ISO 8601 の時刻に、date は ISO 形式の日付に、set はリストになる。to、cc、bcc に受信者が 1 人だけ指定されていれば、リストに包まれる。
  • レスポンスの整形は 1 点だけである。コレクションの data 配列をエンベロープから取り出す。ページングされる一覧では hasMore と nextCursor と並んで items として返し、contacts.list_people では hasMore、nextCursor、seen と並んで items、emails.send_batch では sent と failed と並んで items、templates.list_sends では total、page、pageSize と並んで items、temp_mail.list_messages では hasMore、nextCursor、expiresAt と並んで items、addresses.list では unrestricted、domains、hasMore と nextCursor と並んで addresses として返す。imports.list_failures は、API が送るとおりの形 {'object': ..., 'data': [...], 'nextCursor': ...} のまま残される唯一の一覧である。それ以外の場所ではただのリストになる。中に含まれる各リソースは、ドキュメントに記載された HTTP 上の形をそのまま保つ。

この約束を守らせているのがパッケージのパリティチェックである。すべてのメソッドを対応する TypeScript のメソッドと並べて、同じ引数で、すべてのオプションを指定して実行し、メソッドが欠けている場合、異なるオプションを受け取る場合、異なるリクエストを送る場合、異なる値を返す場合に失敗する。