一斉配信
`broadcasts.preview`、`send`、`list`、`list_all`、`iterate`、`get`、`list_recipients`、`list_all_recipients`、`iterate_recipients`、`get_recipient`、`stats`、`analytics`、`cancel`。
すべてのメソッド
import time from openemail import openemailfrom openemail.types import BroadcastCreate draft: BroadcastCreate = { 'audienceIds': ['aud_4c1b8e2a7d9f05c36b4e8a71'], 'from': 'Acme <[email protected]>', 'subject': '{{firstName|Hello}}, the September release is out', 'html': '<p>Hi {{firstName|there}},</p><p>Here is what changed this month.</p>', 'text': 'Hi {{firstName|there}}, here is what changed this month. Unsubscribe: {{unsubscribeUrl}}', 'tags': {'campaign': 'release-2026-09'},} reach = openemail.broadcasts.preview(draft)print(reach['recipients'], reach['unsubscribed'], reach['suppressed']) broadcast = openemail.broadcasts.send(draft) latest = openemail.broadcasts.get(broadcast['id'])while latest['status'] in ('scheduled', 'queued', 'sending'): time.sleep(5) latest = openemail.broadcasts.get(broadcast['id']) for copy in openemail.broadcasts.iterate_recipients(broadcast['id']): print(copy['email'], copy['status'], copy['opens'], copy['clicks']) bounced = openemail.broadcasts.list_recipients(broadcast['id'], filter='bounced')if bounced['items']: content = openemail.broadcasts.get_recipient(broadcast['id'], bounced['items'][0]['emailId']) print(content['subject'], content['bouncedAt']) stats = openemail.broadcasts.stats(broadcast['id'], grain='day')print(stats['totals']['opened'], stats['totals']['clicked'], stats['totals']['unsubscribed']) lately = openemail.broadcasts.stats(broadcast['id'], days=1)print(lately['window']['opened'] if lately['window'] else None) month = openemail.broadcasts.analytics(days=30)for row in month['broadcasts']: print(row['subject'], row['sent'], row['opened']) later = openemail.broadcasts.send({**draft, 'scheduledAt': 'P1D'})openemail.broadcasts.cancel(later['id']) history = openemail.broadcasts.list(audience_id=draft['audienceIds'][0])print(latest['status'], latest['counts']['sent'], len(history['items']))一斉配信は、1 つ以上のオーディエンス内の全員に 1 通のメッセージを、一人ずつ別のコピーとして送ります。各コピーの受信者はちょうど一人で cc も bcc もないため、他に誰に送られたかは誰にも見えず、各コピーは独自の msg_ ID、イベント、トラッキング、Webhook を持つ普通のメールです。list_recipients で、それぞれがどうなったかとあわせて一覧できます。一斉配信そのものが記録なので、コピーは「送信済み」フォルダに保存されません。
send はすぐに queued の一斉配信を返し、scheduledAt を渡した場合は scheduled で返します。送信はバックグラウンドで続きます。send には emails:send と audiences:read、preview には audiences:read、list、list_all、iterate、get、list_recipients、list_all_recipients、iterate_recipients、get_recipient、stats、analytics には emails:read、cancel には emails:send が必要です。
どの send にも Idempotency-Key が付きます。idempotency_key= で指定したもの、または SDK が作ったものです。そのため、ネットワーク障害後の再試行は、2 回送るのではなく、最初の試行が作った一斉配信を返します。preview、get、cancel とすべての読み取りは安全に繰り返せ、再試行されます。
差し込み項目
subject、html、text は一人ひとりの連絡先から埋められます。{{firstName}} は連絡先の名前の最初の語、{{lastName}} は残り、{{name}} は名前全体、{{email}} はコピーの送り先アドレス、{{unsubscribeUrl}} はその人を配信停止にするリンクです。
各項目はバーの後に代替値を取り、連絡先に値がないときに使われるので、名前なしで保存された連絡先では {{firstName|there}} が "there" になります。html では値がエスケープされ、他の {{…}} は書かれたとおりに残ります。
保存済みのテンプレートを送るには、html と text の代わりに template を渡します。同じ 5 つの値がプロパティとして渡されますが、テンプレートが宣言しているものに限られるので、firstName を宣言しているテンプレートはそれを受け取り、宣言していないテンプレートがそのせいで拒否されることはありません。template.props の内容はすべてのコピーに同じように入ります。
配信停止
どのコピーにもワンクリック配信停止ヘッダーが付き、メールクライアントが独自の配信停止ボタンを表示できます。これは大手のメールボックス事業者が一括メールに求めているものです。{{unsubscribeUrl}} を自分で置いていない html または text の本文には、リンク付きの 1 行のフッターが付きます。テンプレートはそのまま送られるので、テンプレートに {{unsubscribeUrl}} を入れてください。
配信停止すると、その一斉配信が送られたすべてのオーディエンスでその人が配信停止として記録され、AudienceContactResource.unsubscribedAt が audiences.list_contacts でそれを示します。その人はオーディエンスとアドレス帳に残り、他のオーディエンスには影響せず、1 通ずつ送るメールは引き続き届きます。オーディエンスから外して追加し直すと、改めて購読状態になります。
スキップされる人
一斉配信は audienceIds のうち少なくとも 1 つに入っているすべての連絡先に、いくつに入っていても 1 回だけ届きます。スキップされるのは、それらのオーディエンスのうち自分が入っているすべてで配信停止した連絡先と、バウンスや苦情のため、あるいは誰かが追加したために抑止リストにあるアドレスです。send の後、送信が届く前にオーディエンスに追加された連絡先には届きます。
preview は何も送らずに同じ数、recipients、unsubscribed、suppressed を返します。誰にも届かない send は 422 no_recipients を送出します。
何かを書き込む前に送信全体がプランの月間送信数と照合されるので、割り当てで賄えない一斉配信は 429 send_quota_exceeded を送出し、何も残しません。コピー 1 通が 1 回の送信として数えられます。
状態と進み具合
get はコピーから counts を直接読むので、一斉配信の送信中はこれをポーリングしてください。status は scheduled または queued から sending に進み、渡したすべてのコピーが送られたか失敗すると sent で落ち着きます。completedAt が最後の人に届いたことを示した後でも、送信待ちのコピーがある間は sending のままです。failed は一斉配信全体が止まったことを意味し、lastError が理由を示します。from アドレスから送信できなくなった、テンプレートが解決できなくなった、途中でプランが尽きた、送信自体が失敗し続けた、またはコピーを 1 通も書き込めなかった、のいずれかです。
cancel は scheduled、queued、sending の一斉配信を止めます。新たに誰も追加されず、送信待ちのコピーはすべてキャンセルされますが、送られたコピーは取り消せません。すべてのコピーが送られた後の cancel は 409 broadcast_not_cancellable を送出し、キャンセル済みの一斉配信をキャンセルするとその時点の状態で返します。
届いた相手
list_recipients は、一斉配信の宛先となった人たちを、コピーごとに 1 行、アドレス順に並べた 1 ページを、items、hasMore、nextCursor を持つ dict として返します。list_all_recipients はすべてのページをたどって 1 つのリストにまとめ、iterate_recipients はコピーを 1 通ずつ返し、ループが求めたときにだけ次のページを取得します。limit は 1 から 200 までで既定は 50、cursor は同じ filter と q とともに渡します。
| filter | 残すもの |
|---|---|
| pending | まだキューにある、予約済み、または送信中のコピー。 |
| sent | 送信されたコピー。 |
| delivered | 受信側サーバーが受け付けたコピー。 |
| opened | 1 回以上開封されたコピー。 |
| not_opened | 送信済みで一度も開封されていないコピー。 |
| clicked | トラッキング対象のクリックが 1 回以上あったコピー。 |
| bounced | バウンスしたコピー。 |
| complained | 受信者がスパムとして報告したコピー。 |
| failed | 失敗またはキャンセルされたコピー。 |
| unsubscribed | 一斉配信の送信後に登録解除した人。 |
BROADCAST_RECIPIENT_FILTERS が各フィルターに名前を付け、q はアドレスと名前を大文字と小文字を区別せずに検索します。開封とクリックには画像プロキシとリンクスキャナーによるものは含まれず、トラッキングをオフにして送信した一斉配信では 0 のままです。
get_recipient(id, email_id) はコピーを 1 通返します。同じ行に加え、その人が受け取ったとおりの subject、html、text を、差し込みフィールドを埋め、その人専用の登録解除リンクを付けた状態で含みます。HTML は開封とクリックのトラッキングを追加する前のものです。この一斉配信のコピーではない email_id は 404 recipient_not_found を、存在しない一斉配信は 404 broadcast_not_found を送出します。
stats は合計と系列を返します。totals は sent、delivered、bounced、complained、failed のコピー数と、まだ待機中のものを表す pending、そして opened、clicked、unsubscribed した人数を数え、opens と clicks をイベント数として持ちます。series は疎で古い順で、何かが起きた grain(minute、hour、day、既定は hour)ごとに 1 つのバケットがあり、UTC から東へ offset_minutes のオフセットで区切られます。各人はそれが初めて起きた時点で 1 回だけ数えられるため、合計と一致します。
特定のアドレスやドメインに限定されたキーが届くのは、自分が持つアドレスやドメインから送られた一斉配信だけです。list、list_all、iterate はそれ以外を除外し、get、受信者系のメソッド、stats、cancel はそれらに対して 404 broadcast_not_found を送出します。
レスポンス: BroadcastResource
get と cancel はそれぞれこれを 1 つ返し、send は SentBroadcastResource を返します。これは同じフィールドに replayed を加えたもので、同じ冪等性キーを使った以前の呼び出しが作成した一斉配信が返ってきた場合に True になります。list はこれを並べたページを、items、hasMore、nextCursor を持つ dict として新しい順に返し、list_all と iterate はすべてのページをたどります。preview は audienceIds、recipients、unsubscribed、suppressed を持つ BroadcastPreviewResource を返します。list_recipients は BroadcastRecipientResource 行のページ、get_recipient は BroadcastRecipientContentResource、stats は BroadcastStatsResource を返します。
idstr- 永続的なハンドル。`brd_` に続く 24 文字の 16 進数です。
statusBroadcastStatus- `scheduled`、`queued`、`sending`、`sent`、`cancelled`、`failed` のいずれか。`BROADCAST_STATUSES` がそれぞれを名前で示します。
modeApiKeyMode- 作成したキーに応じて `live` または `test`。テスト一斉配信のコピーは送信済みとして記録され、誰にも配信されません。
sourceEmailSource | str- 開始された場所。キーなら `api`、接続されたアプリなら `oauth`、アプリなら `composer`、アシスタントなら `mcp` です。
audienceIdslist[str]- 送り先のオーディエンス。それぞれ 1 回ずつです。
fromstr- すべてのコピーの送信元アドレス。
subjectstr- 書かれたとおりの件名で、差し込み項目もそのままです。テンプレートが件名を用意する場合は空です。
countsBroadcastCounts- `recipients` は `send` 時の見積もりです。`created` は書き込まれたコピーの数、`skipped` はその時点でアドレスが抑止されていたために飛ばされた人の数、`failedToQueue` はコピーを書き込めなかった人の数です。`queued`、`sending`、`sent`、`failed`、`cancelled` は、各コピーの現在の状態ごとの数です。
lastErrorstr | None- 一斉配信が失敗した理由、または書き込めなかった最新のコピーとその理由。問題がない間は `None` です。
scheduledAtstr | None- ISO-8601 UTC で、送信が始まる予定の日時。すぐに送った一斉配信では `None` です。
startedAtstr | None- ISO-8601 UTC で、送信が最初の人たちに届いた日時。
completedAtstr | None- ISO-8601 UTC で、最後の人に届いた日時。その後もコピーが送信待ちのことがあります。
cancelledAtstr | None- ISO-8601 UTC で、`cancel` が止めた日時。
createdAtstr- ISO-8601 UTC で、`send` が呼ばれた日時。一覧の順序を決めます。
updatedAtstr- ISO-8601 UTC で、送信が進むにつれて更新されます。
レスポンス: BroadcastRecipientResource
list_recipients、list_all_recipients、iterate_recipients の各行です。get_recipient が返す BroadcastRecipientContentResource は、これに subject、html、text を加えます。
emailIdstr- この人のコピーの `msg_` ID。`get_recipient` は内容とともにそれを読み、`emails.get` は送信済みメールとして読みます。
contactIdstr | None- 送信先の連絡先。その後に連絡先が削除された場合は `None`。
emailstr- コピーの送信先アドレス。
namestr | None- 連絡先の名前。
statusstr- コピーの状態: `queued`、`scheduled`、`sending`、`sent`、`failed`、`cancelled` のいずれか。
sentAtstr | None- ISO-8601 UTC、コピーが送信された日時。
deliveredAtstr | None- ISO-8601 UTC、受信側サーバーが受け付けた日時。最初の `email.delivered` です。
bouncedAtstr | None- ISO-8601 UTC、バウンスした日時。最初の `email.bounced` です。
complainedAtstr | None- ISO-8601 UTC、受信者がスパムとして報告した日時。最初の `email.complained` です。
failurestr | None- コピーが失敗した場合の、その理由。
opensint- 記録された開封数。画像プロキシとスキャナーによるものは除きます。トラッキングがオフだった場合は 0。
firstOpenAtstr | None- ISO-8601 UTC、最初の開封。
clicksint- トラッキング対象のリンクで記録されたクリック数。スキャナーによるものは除きます。
firstClickAtstr | None- ISO-8601 UTC、最初のクリック。
unsubscribedAtstr | None- ISO-8601 UTC、送信後にこの人が一斉配信のオーディエンスのいずれかから、そのリンク経由またはその他の方法で登録解除した日時。
リファレンス
broadcasts.preview()完全なリファレンスbroadcasts.send()完全なリファレンスbroadcasts.list()完全なリファレンスbroadcasts.list_all()完全なリファレンスbroadcasts.iterate()完全なリファレンスbroadcasts.get()完全なリファレンスbroadcasts.list_recipients()完全なリファレンスbroadcasts.list_all_recipients()完全なリファレンスbroadcasts.iterate_recipients()完全なリファレンスbroadcasts.get_recipient()完全なリファレンスbroadcasts.stats()完全なリファレンスbroadcasts.analytics()完全なリファレンスbroadcasts.cancel()完全なリファレンス