連絡先、オーディエンス、一斉配信
アドレス帳、オーディエンス、一斉配信、抑止リストのすべてのコマンドと実例。
それぞれの関係
メールを送る相手は 4 つの名前空間で扱います。連絡先はワークスペースのアドレス帳、オーディエンスは名前付きの連絡先リスト、一斉配信はいくつかのオーディエンスの全員に 1 つのメッセージを送るもの、抑止リストはワークスペースが送信しないアドレスを保持するものです。各コマンドは SDK のメソッドを 1 つ呼び出すので、SDK のページでは同じ呼び出しをさらに詳しく説明しています。
- 連絡先には ID がありません。すべての
contactsコマンドはアドレスをキーとして受け取り、前後の空白を除いて小文字にするので、[email protected]と[email protected]は同じ連絡先です。オーディエンスにはaud_の ID、一斉配信にはbrd_の ID があり、抑止にはsuppressions listが表示する ID があります。 - すべての連絡先は、存在する限り既定のオーディエンスに含まれます。そのオーディエンスは削除することも、空にすることも、連絡先を外すこともできず、
builtinはdefaultです。 - アドレス帳はワークスペースに属するので、すべてのメンバーとすべてのキーが同じアドレス帳を読み書きします。
- 各名前空間は
openemail contact getのように単数形でも使え、いつもの別名ls、show、new、edit、rmも使えます。動詞がaddとremoveのsuppressionsでは、newはaddに、rmはremoveになります。
openemail <namespace> <verb> --help は、すべてのフラグをその型、スコープ、エンドポイント、コマンドが返す内容とともに表示します。--json を付けると、同じページをデータとして出力します。
連絡先
ワークスペースのアドレス帳です。メンバーがアプリの作成画面からメールを送った相手と、手動で保存した人が入ります。届いたメールで誰かが追加されることはなく、API や CLI からの送信でも追加されません。
| コマンド | 機能 |
|---|---|
| openemail contacts list | 保存された連絡先を、最近メールした順に 1 ページ表示します。--source で manual か auto の連絡先に絞り、--q で名前とアドレスを検索します |
| openemail contacts get <email> | 1 件の連絡先を、所属するすべてのオーディエンスとともに |
| openemail contacts create --email <value> | --name、--notes、--audience-ids を付けて新しい連絡先を保存します。すでにアドレス帳にあるアドレスは 409 contact_exists で拒否されます |
| openemail contacts update <email> | --name や --notes を変更します。null を渡すと消去されます。アドレスそのものは変更できません |
| openemail contacts delete <email> | 連絡先をメモ、写真、所属とともに削除し、作成画面が再び記録しないようにアドレスを非表示にします |
| openemail contacts set-audiences <email> --audience-ids <a,b> | 連絡先が所属するオーディエンスを、このリストのとおりにします。既定のオーディエンスは常に残ります |
| openemail contacts list-people | 「連絡先」ページに表示される全員です。保存された連絡先と、threads:read があればメールに登場したすべてのアドレスを、スレッド数とともに表示します。--sort、--q、--email、--blocked で絞り込めます |
| openemail contacts save <email> | アドレスを保存するか、送信から記録されたものを残すか、削除したものを復活させます。アドレスがどの状態でもエラーにはなりません |
| openemail contacts delete-many <emails...> | 1 回の呼び出しで 1 から 200 件のアドレスを削除して非表示にします |
| openemail contacts set-photo <email> <data> | ファイルから、または - で stdin から写真をアップロードします。5 MB までの PNG、JPEG、WebP、GIF です |
| openemail contacts remove-photo <email> | 写真を外し、保存された画像を削除します |
| openemail contacts block <email> | アドレスをワークスペースのブロックリストに入れ、そこからのメールを拒否します。プラスタグは取り除かれます |
| openemail contacts unblock <email> | そのアドレスをブロックしているブロックリストのルールを、ドメイン全体のルールも含めてすべて外します |
| openemail contacts list-threads <email> | そのアドレスが書いた、またはそのアドレス宛てに書かれたスレッドを、すべてのフォルダーから表示します。--q でその中を検索します |
| openemail contacts activity <email> | ある期間にそのアドレスから受信したメールと、そのアドレスに送信したメールです。期間は --minutes で指定しない限り 90 日で、返信待ちのスレッドと、双方向の返信時間の中央値も含みます |
オーディエンス
名前付きの連絡先リストで、1 つのワークスペースに最大 100 個作れます。アドレスはオーディエンスに加わる前に連絡先になっている必要があります。例外は import-contacts で、新しいアドレスを処理しながら保存します。
| コマンド | 機能 |
|---|---|
| openemail audiences list | オーディエンスの 1 ページです。既定のオーディエンスが最初で、残りは新しい順に、それぞれ contactCount 付きで表示します |
| openemail audiences growth | ある期間にオーディエンスがどう増えたかです。期間は --days か --minutes で指定しない限り 30 日で、区間ごとの参加数と配信停止数、そして合計を示します |
| openemail audiences get <id> | 1 つのオーディエンスを、最新の contactCount とともに |
| openemail audiences create --name <value> | 空のオーディエンスを作成します。--description は任意です。名前は重複してもかまいません |
| openemail audiences update <id> | --name や --description を変更します。所属する連絡先には影響しません |
| openemail audiences delete <id> | オーディエンスを削除し、その連絡先は残します。既定のオーディエンスは削除できません |
| openemail audiences empty <id> | すべての連絡先を外し、オーディエンス自体は ID、名前、説明とともに残します |
| openemail audiences list-contacts <id> | オーディエンス内の連絡先の 1 ページです。それぞれいつ参加したか、配信停止したかを示します。--sort、--q、--source、--statuses で絞り込めます |
| openemail audiences add-contact <id> --email <value> | 既存の連絡先を 1 件オーディエンスに入れます。すでにいる人を追加しても何も変わりません |
| openemail audiences remove-contact <id> <email> | 連絡先を 1 件外します。オーディエンスにいない連絡先は 404 になります |
| openemail audiences add-contacts <id> --emails <a,b> | 既存の連絡先を最大 200 件入れ、連絡先でないアドレスは missing で報告します |
| openemail audiences remove-contacts <id> --emails <a,b> | 最大 200 件の連絡先を外し、含まれていなかったものを報告します |
| openemail audiences import-contacts <id> --contacts <json|@file|-> | 最大 500 行の { email, name } をインポートし、まだ連絡先でないアドレスを保存します |
一斉配信
最大 10 個のオーディエンスの全員に 1 つのメッセージを送ります。一人ひとりに別々のコピーとして、差し込みフィールドを埋め、配信停止リンクを付けて送られます。各コピーは通常のメールで、それぞれ独自の msg_ の ID、イベント、Webhook を持ちます。
| コマンド | 機能 |
|---|---|
| openemail broadcasts preview --audience-ids <a,b> | これらのオーディエンスへの一斉配信が誰に届き、配信停止や抑止のために誰をスキップするかを数えます。何も送信しません |
| openemail broadcasts send --audience-ids <a,b> --from <value> | --subject と --html または --text、あるいは保存済みの --template を使って、今すぐ、または --scheduled-at の日時に送信します |
| openemail broadcasts list | 一斉配信を新しい順に 1 ページ、リアルタイムの件数とともに表示します。--audience-id でそのオーディエンスに送ったものに絞ります |
| openemail broadcasts get <id> | 1 つの一斉配信を、ステータスとリアルタイムの件数とともに表示します。送信中にポーリングするためのコマンドです |
| openemail broadcasts stats <id> | 配信、バウンス、開封、クリック、配信停止の合計と、--grain の区間ごとの系列です。区間は指定しない限り 1 時間です |
| openemail broadcasts list-recipients <id> | 各コピーが誰に送られ、どうなったかです。--filter で bounced や not_opened などの 1 つのグループに絞ります |
| openemail broadcasts get-recipient <id> <email-id> | 1 人分のコピーを、その人が受け取ったとおりの件名、HTML、テキストで表示します |
| openemail broadcasts cancel <id> | 予約済み、キュー待ち、または送信中の一斉配信を止めます。送信済みのコピーは取り消せません |
抑止リスト
このワークスペースが送信しないアドレスです。発生時に記録されるハードバウンスと苦情、そして手動で追加したアドレスが入ります。これらのアドレスへの送信は、何かが送り出される前にその受信者について拒否されます。
| コマンド | 機能 |
|---|---|
| openemail suppressions list | リストの 1 ページを新しい順に表示します。--reason で bounce、complaint、manual に絞り、--q で検索します |
| openemail suppressions get <id> | 1 行分です。アドレス、理由、バウンスや苦情に含まれていた詳細、そして削除できるかどうか |
| openemail suppressions add --email <value> | アドレスへの送信を止めます。すでにあるアドレスを追加すると、既存の行が返ります |
| openemail suppressions remove <id> | そのアドレスへのメールを再び許可します。ハードバウンスは削除できません |
抑止とブロックリストは別のリストです。suppressions add はアドレスへの送信を止め、contacts block はそのアドレスから届くメールを拒否します。
スコープ
ほとんどのコマンドには、その名前空間の読み取りまたは書き込みのスコープが必要です。別のものを読んだり変更したりするため、別のスコープが必要なコマンドもいくつかあります:
| スコープ | コマンド |
|---|---|
| contacts:read | contacts list、get、list-people |
| contacts:write | contacts create、update、delete、save、delete-many、set-photo、remove-photo、そして audiences:write に加えて audiences import-contacts |
| audiences:read | audiences list、growth、get、list-contacts、そして broadcasts preview。そのため送信できないキーでも件数を表示できます |
| audiences:write | その他すべての audiences コマンドと contacts set-audiences。contacts create --audience-ids には contacts:write に加えてこれが必要です |
| threads:read | contacts list-threads と activity、そして list-people でメールに登場したアドレス |
| settings:read | suppressions list と get |
| settings:write | suppressions add と remove、そして contacts block と unblock |
| emails:read | broadcasts list、get、stats、list-recipients、get-recipient |
| emails:send | audiences:read も必要な broadcasts send と、broadcasts cancel |
- 特定のアドレスやドメインに限定されたキーも、他のすべてのキーと同じアドレス帳を読み書きします。見えるのは自分が持つアドレスやドメインから送られた一斉配信だけで、
list-peopleからは保存された連絡先だけを得ます。また、contacts list-threads、activity、block、unblock、そしてsuppressions addとremoveでは 422capability_unsupportedで拒否されます。 - 一部のアドレスにしか届かないメンバーのブラウザでのサインインは、すべての
contacts、audiences、broadcastsコマンドで 422capability_unsupportedで拒否されます。suppressions addは、ワークスペースのオーナー以外によるブラウザでのサインインを拒否します。
実例
ファイルからオーディエンスを作り、そこへの一斉配信が誰に届くかを数えます。import-contacts はまだ連絡先でないアドレスを保存し、もう一度実行しても何も二重に作成や追加はされません。
[ { "email": "[email protected]", "name": "Ada Lovelace" }, { "email": "[email protected]", "name": "Grace Hopper" }, { "email": "[email protected]" }]AUDIENCE=$(openemail audiences create --name 'Product updates' --json | jq -r .id)openemail audiences import-contacts "$AUDIENCE" --contacts @contacts.jsonopenemail broadcasts preview --audience-ids "$AUDIENCE"リクエストを表示するだけで何も送らない --dry-run で一斉配信を確認してから送信します。一斉配信はすぐに作成され、バックグラウンドで送信されるので、get をポーリングして進み具合を追ってください。この本文には {{unsubscribeUrl}} が置かれていないため、各コピーに 1 行の配信停止フッターが付きます。
{ "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>", "scheduledAt": "2026-10-01T09:00:00Z"}openemail broadcasts send --data @broadcast.json --dry-runBROADCAST=$(openemail broadcasts send --data @broadcast.json --yes --json | jq -r .id)openemail broadcasts get "$BROADCAST"openemail broadcasts stats "$BROADCAST" --grain day一斉配信が誰に届かなかったかを確認します。--ndjson は 1 行に 1 人の受信者を、--all --json はすべてのページを含む 1 つのドキュメントを出力します。
openemail broadcasts list-recipients brd_5a8c1e3f7b2d94a06c8e1f3b --filter bounced --ndjson | jq -r .emailopenemail broadcasts list-recipients brd_5a8c1e3f7b2d94a06c8e1f3b --filter not_opened --all --json | jq ".items | length"openemail suppressions list --reason bounce --all --max 50あるオーディエンスの購読中のメンバーを別のオーディエンスにコピーします。jq がストリームを add-contacts が受け取る本文に変換し、--data - がそれを stdin から読みます。--max 200 で、1 回の呼び出しが受け付ける 200 件のアドレスに収めます。
openemail audiences list-contacts aud_9f2c4b7e1a0d63d84c5f2e7b --statuses subscribed --max 200 --ndjson \ | jq -s '{ emails: map(.email) }' \ | openemail audiences add-contacts aud_1c4e7a9b2d0f36e85a7c1b4d --data -作成画面が記録した、あるドメインの連絡先をすべて削除します。delete-many は 1 回の呼び出しで最大 200 件のアドレスを受け付けるので、長いリストは xargs -n 200 で分割します。元に戻せないので、先に --dry-run で各バッチを確認してください。
openemail contacts list --source auto --all --ndjson \ | jq -r 'select(.email | endswith("@old-vendor.example")) | .email' > leaving.txtxargs -n 200 openemail contacts delete-many --dry-run < leaving.txtxargs -n 200 openemail contacts delete-many --yes < leaving.txtアドレスへの送信を止め、別のアドレスを再び許可し、送信者をブロックします。removable は、suppressions remove がどの行を受け付けるかを示します。
openemail suppressions add --email [email protected]openemail suppressions list --q [email protected] --json | jq -r '.items[] | select(.removable) | .id'openemail suppressions remove 7b1e2c3d-4f5a-4b6c-8d7e-9f0a1b2c3d4e --yesopenemail contacts block [email protected]確認と確認コード
次のコマンドは、ターミナルで実行する前に確認を求めます:
| 名前空間 | 確認を求めるもの |
|---|---|
| contacts | delete、delete-many、remove-photo、unblock |
| audiences | delete、empty、remove-contact、remove-contacts |
| broadcasts | send と cancel |
| suppressions | remove |
--yesは代わりに確認します。--jsonや--no-inputを付けたとき、CI の中、またはターミナルがないときの無人実行では、確認を求めるはずのコマンドはRefusing to run unattended. Pass --yes to confirm.と終了コード2で停止します。--dry-runはコマンドが送るはずのリクエストを表示し、確認も変更もせずに終了コード0で終了します。- ブラウザでサインインしている場合、
audiences deleteは、Web アプリと同じようにまず確認コードを求めます。--yesでこれを省略することはできず、無人実行ではコマンドは終了コード4で停止します。事前にopenemail verifyを実行するか、確認コードを求められることのない API キーを使ってください。 audiences emptyは確認コードを求めないので、--yesを渡す前に ID を確認してください。
ページング
一覧を返すコマンドはどれも 1 ページを読みます。続きがある場合は、表示されたカーソルを同じ絞り込み条件とともに --cursor に渡すか、すべて読みます:
--allはすべてのページを読んで項目をストリームします。ターミナルでは表として、パイプしたときや--ndjsonを付けたときは 1 行に 1 つの JSON オブジェクトとして出力します。--max <n>はその件数で停止し、--allを含意します。--jsonは、--allの場合も含めて 1 つの{ items, hasMore, nextCursor }ドキュメントを出力します。- 形式が正しくないカーソルや古いカーソルは 400
invalid_cursorになります。カーソルなしで最初からやり直してください。
| コマンド | ページサイズ |
|---|---|
| openemail contacts list | 1 から 200。--limit で指定しない限り 50 |
| openemail contacts list-people | 1 から 100。--limit で指定しない限り 25 |
| openemail contacts list-threads | 1 から 100。--limit で指定しない限り 25 |
| openemail audiences list | 1 から 100。--limit で指定しない限り 25 |
| openemail audiences list-contacts | 1 から 200。--limit で指定しない限り 50 |
| openemail broadcasts list | 1 から 100。--limit で指定しない限り 25 |
| openemail broadcasts list-recipients | 1 から 200。--limit で指定しない限り 50 |
| openemail suppressions list | 1 から 100。--limit で指定しない限り 25 |
知っておきたいこと
contacts createはすでにアドレス帳にあるアドレスを 409contact_existsで拒否するので、再試行によって誰かが編集した名前が上書きされることはありません。contacts saveは決して拒否せず、アドレスがどの状態でも、保存、維持、または復活させます。contacts deleteは、メールに登場しただけのアドレスも受け付け、その人をlist-peopleから外します。メールは残ります。元に戻すことはできず、アドレスを再び保存すると、名前もメモもなく、既定のオーディエンス以外には所属しない連絡先として始まります。- アドレスは連絡先の識別子なので、
contacts updateでは変更できません。連絡先を移すにはdeleteとcreateを行います。 contacts set-photoは画像をファイルから、または-で stdin から読みます。image/jpegのように--content-typeを渡してください。付けないと画像がapplication/octet-streamとして送られることがあり、サーバーはそれを 422invalid_imageで拒否します。broadcasts send --scheduled-atは、2026-10-01T09:00:00Zのような ISO 8601 の日時か、PT2HやP1Dのような ISO 8601 の期間を、365 日後まで受け付けます。send --atが受け付ける2hのような短い遅延は、ここでは拒否されます。- 差し込みフィールドは
--subject、--html、--textで使えます。{{firstName}}、{{lastName}}、{{name}}、{{email}}、{{unsubscribeUrl}}で、{{firstName|there}}のように縦棒の後に代替値を書けます。{{unsubscribeUrl}}を置いていない本文には 1 行の配信停止フッターが付きます。テンプレートはそのまま送られるので、リンクはテンプレートに入れてください。 - 一斉配信は、何かが書き込まれる前にプランの月間送信数と照合され、各コピーは 1 回の送信として数えられます。枠で賄えない一斉配信は 429
send_quota_exceededで拒否され、何も残りません。 - スクリプトがその手順をもう一度実行する可能性がある場合は、
broadcasts sendに独自の--idempotency-keyを渡してください。同じキーでは、新しく送る代わりに、そのキーで作成された一斉配信が返ります。 - 一斉配信から配信停止した連絡先は、
unsubscribedAtが設定された状態でオーディエンスに残り、そのオーディエンスへの以降の一斉配信ではスキップされます。audiences list-contacts --statuses unsubscribedでそれらを一覧表示できます。 - ハードバウンスは抑止リストに残ります。
suppressions removeはそれを 409suppression_not_removableで拒否し、各行のremovableで事前にわかります。