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

連絡先

`contacts->list`、`get`、`create`、`save`、`update`、`setAudiences`、`delete`、`deleteMany`、`listPeople`、`setPhoto`、`removePhoto`、`block`、`unblock`、`listThreads`、`activity`。

すべてのメソッド

usage.php
$page = $client->contacts->list(limit: 100);$contact = $client->contacts->get('[email protected]'); $saved = $client->contacts->create([    'email' => '[email protected]',    'name' => 'Grace Hopper',    'notes' => 'Met at the compiler workshop',]); $client->contacts->update('[email protected]', ['notes' => null]);$client->contacts->setAudiences('[email protected]', ['audienceIds' => ['aud_4c1b8e2a7d9f05c36b4e8a71']]);$client->contacts->delete('[email protected]'); echo count($page), ' ', $page->hasMore ? 'more to come' : 'that is all', PHP_EOL;echo $contact['source'], ' ', $contact['lastSeenAt'] ?? 'never mailed', ' ', $saved['source'], PHP_EOL;

list は最近見かけた連絡先から順に返し、一度もメールを送っていない連絡先は最後になります。source が auto なのは、メンバーがアプリのコンポーザーからそのアドレスにメッセージを送ったために行が書き込まれた場合で、誰かが保存したというのとは本質的に異なる主張です。あるアドレスからメールが届いても何も書き込まれず、この API を通じた送信でも書き込まれません。

アドレス帳は一人の人ではなくワークスペースに属するため、どのメンバーが保存した連絡先も、すべてのメンバーとすべてのキーから見える連絡先になります。create は source を manual として書き込み、書き込みと同時に連絡先を既定のオーディエンスに入れます。同じ呼び出しで自分のリストにも加えるには audienceIds にそれらを指定します(audiences:write も必要です)。または後から audiences->addContact で追加します。これはオーディエンスのページで説明しています。setAudiences は、連絡先がどのリストに入るかを 1 回の呼び出しで正確に指定します。

アドレスは小文字で保存され、クライアントは渡されたアドレスをエンコードするため、[email protected] も正しい行に届きます。空のアドレスは、何かが送信される前に InvalidArgumentException をスローします。アドレスが識別子なので update では変更できません。連絡先を移すには delete と create を行います。

パラメーター:contacts->list

limitint
1 ページあたりに返す連絡先の数で、1〜200 の整数、既定値は 50 です。範囲外の値は丸められるのではなく 422 になります。引数の型は `int` なので、クエリ文字列から読んだ値は先に `(int)` でキャストしてください。
cursorstring
前のページの `nextCursor`。自分で組み立てないでください。もう存在しない連絡先を指すカーソルは 400 `invalid_cursor` になり、`InvalidRequestException` としてスローされます。これはページ分割の状態が古くなったことを意味し、カーソルなしで走査をやり直すべきです。
sourcestring
誰かが意図して保存した連絡先は `manual`、アプリのコンポーザーが記録したものは `auto`。アドレス帳全体を対象にするには省略します。
qstring
名前とアドレスを最大 200 文字で検索します。最初のページで完全に一致するものがなければ、代わりに近い綴りが返り、続くページも同じ方法で一致を続けます。

レスポンス:連絡先

contacts->list は OpenEmail\Result\Page を返すため、行は $page->items にあり、走査は $page->hasMore が true の間 $page->nextCursor をたどります。listAll はすべての行を 1 つの配列として返し、iterate は 1 行ずつ yield する Generator を返します。get、create、update、save、setAudiences はいずれも 1 件の連絡先を camelCase のキーを持つ配列として返し、同じ行に audiences が加わります。アドレス帳には上限がないため、このルートは、200 件で黙って打ち切られた配列を返すのではなく、ページ分割します。

objectstring
常に文字列 `contact` です。`get` のときだけでなく一覧の行でも同じです。
emailstring
アドレスです。書き込み時に小文字化されるので `[email protected]` と `[email protected]` は 1 件の連絡先になります。連絡先 id は公開されないため、すべての contacts メソッドが受け取るキーはこれです。行は書き込んだメンバーやキーではなくワークスペースに属するので、ワークスペース上のすべてのメンバーとすべてのキーが 1 つのアドレス帳を読み書きします。
namestring or null
表示名で、そのアドレスに名前が一度も記録されていない場合は null です。自動の書き込みが名前を持つのは、ヘッダーがアドレス自体以外のものを示した場合だけで、ユーザーが入力した名前を上書きすることは決してありません。
sourcestring
`auto` は、ユーザーがそのアドレスにメールを送ったために行が書き込まれたことを意味します。`manual` は誰かが手で入力したことを意味し、これは本質的に異なる主張です。upsert が `manual` を `auto` に戻すことはありません。あるアドレスからメールが届いても、意図的に行は一切書き込まれないため、あなたにメールを書いてきただけの人はここには含まれません。この列は既定値が `manual` の自由記述のテキストなので、値は決まった集合のない文字列として扱ってください。
notesstring or null
誰かがアプリまたは `update` でこの人について書いた自由記述のテキストで、自動生成されることはありません。誰も何も書いていない場合は null で、`update` で `'notes' => null` を渡すと消去されます。
lastSeenAtstring or null
ISO 8601 の UTC の文字列で、メンバーがアプリのコンポーザーからそのアドレスに送信するたびに更新されます。そのアドレスからメールが届いたときは更新されず、何も書き込まれません。`create` で保存され、一度もメールを送っていない連絡先では null で、このルートが返す `lastSeenAt` の降順では最後に並びます。
audiencesarray
`get`、`create`、`update`、`save`、`setAudiences` にだけ含まれ、一覧の行には含まれません。連絡先が入っているすべてのオーディエンス(既定のものを含む)で、それぞれ `id`、`name`、`builtin` を持つ配列です。`builtin` は、すべての連絡先が属するオーディエンスでは `default`、誰かが作成したものでは null なので、誰でも変更できる名前ではなく、これで分岐してください。
photoUrlstring or null
連絡先の写真が配信される場所です。写真がなければ null です。`setPhoto` で設定し、アップロードのたびに新しい URL になります。

連絡先のオーディエンスを設定する

setAudiences($email, ['audienceIds' => [...]]) は、1 件の連絡先がどのオーディエンスに入るかを 1 回のリクエストで正確に指定します。連絡先は、指定されたオーディエンスのうちまだ入っていないものすべてに加わり、それ以外のすべてから抜けます。呼び出しは変更後の連絡先を audiences 付きで返します。連絡先ではなくメンバーシップを書き込むため audiences:write が必要で、繰り返しても何も変わらないため、クライアントはネットワーク障害の後にリトライします。

既定のオーディエンスは常に維持されるため、'audienceIds' => [] を渡すと、連絡先は既定のオーディエンスだけに入った状態になります。id は最大 100 個まで指定できます。このワークスペースのどのオーディエンスも指さない id は 404 audience_not_found になって何も変わらず、連絡先でないアドレスは 404 contact_not_found になります。どちらも NotFoundException をスローします。

連絡先ページの全員

listPeople は、アプリの連絡先ページに表示される人を一覧にします:保存済みの連絡先と、メールで見かけたすべてのアドレスで、それぞれ saved、threads、lastAt を持ちます。list は保存済みの連絡先だけです。OpenEmail\Result\PeoplePage を返し、これは items、hasMore、nextCursor に seen を加えたものです。メールで見かけたアドレスは、キーが threads:read も持つ場合にだけ含まれ、含まれたかどうかは $page->seen で分かります。sort: は recent、name、threads のいずれかで、OpenEmail\Constants\PeopleSorts がそれらを定義しています。q: は名前、アドレス、メモを検索し、blocked: true はワークスペースのブロックリストがブロックしている人(ドメイン全体のルールを含む)だけを残します。blockedBy はすべての行でそのルールを示します。

people.php
use OpenEmail\Constants\PeopleSorts; $page = $client->contacts->listPeople(sort: PeopleSorts::THREADS, limit: 50); foreach ($page as $person) {    if (!$person['saved'] && $person['threads'] > 5) {        $client->contacts->save($person['email']);    }} $blocked = $client->contacts->listAllPeople(blocked: true);echo $page->seen ? 'saved and seen' : 'saved only', ', ', count($blocked), ' blocked', PHP_EOL;

listAllPeople はすべてのページを 1 つの配列として返し、iteratePeople は各人を yield する Generator を返します。どちらも seen を報告しないため、それを知るには listPeople で 1 ページを読んでください。カーソルは不透明な値なので、nextCursor を受け取ったとおりに cursor: として、同じ sort:、q:、blocked: と一緒に渡し返してください。

保存、削除、写真

name と notes を持つ省略可能な配列を付けた save($email) は、アプリの「連絡先に追加」と「連絡先に残す」にあたります。まだ連絡先でないアドレスを保存し、送信から記録された連絡先を手で保存したものとして残し、削除された連絡先を復活させます。delete は「削除」にあたります。保存済みの連絡先を削除してアドレスを非表示にするため、コンポーザーがそれを再び記録することはありません。メールで見かけただけのアドレスも受け付けます。返される配列の wasSaved が、どちらだったかを示します。deleteMany は 1 回の呼び出しで最大 200 件を削除します。

photo.php
$client->contacts->save('[email protected]', ['name' => 'Grace Hopper']); $contact = $client->contacts->setPhoto('[email protected]', file_get_contents('photo.jpg'), contentType: 'image/jpeg');echo $contact['photoUrl'], PHP_EOL; $client->contacts->setPhoto('[email protected]', new \SplFileInfo('avatar.png')); $client->contacts->removePhoto('[email protected]');$client->contacts->deleteMany(['[email protected]', '[email protected]']);

setPhoto は画像のバイト列をそのまま送ります。最大 5 MB の PNG、JPEG、WebP、GIF で、512 ピクセルの正方形に収められます。バイト列は文字列、fopen のストリームリソース、SplFileInfo、または PSR-7 のストリームかアップロードされたファイルです。contentType: を渡すか、自身の種類を持つバイト列を渡してください。メディアタイプを持つ PSR-7 のアップロードファイルや Symfony または Laravel のアップロード、あるいは名前が .png、.jpg、.jpeg、.webp、.gif で終わるファイルかストリームです。種類がないとバイト列は application/octet-stream として送られ、サーバーは 422 invalid_image で拒否します。OpenEmail\Constants\ContactPhotoTypes がその 4 つの種類を定義しています。アドレスは先に保存済みの連絡先でなければなりません。

ブロック

block($email) はアドレスをワークスペースのブロックリストに載せてそこからのメールを拒否し、プラスタグは取り除きます。unblock($email) はそのアドレスをブロックしているルールをすべて外します。どちらも連絡先ではなくブロックリストを変更するので settings:write が必要で、どちらもアドレスが連絡先である必要はありません。

unblock がドメイン全体のルールを解除すると、removed はそれを list が blockedDomains の行として一覧にし、そのドメインの全員が一緒にブロック解除されます。OpenEmail\Constants\ContactBlockLists が両方のリストを定義しています。

会話とアクティビティ

listThreads($email) は、すべてのフォルダーで、そのアドレスが書いた、またはそのアドレス宛てに書かれたスレッドをページ単位で返し、listAllThreads と iterateThreads はそれらをたどります。activity($email) は連絡先の「アクティビティ」タブの元になる数値を返します:区間ごとの受信数と送信数、あなたの返信を待っているスレッド、双方向それぞれの返信時間の中央値です。どちらも threads:read が必要です。

activity.php
$threads = $client->contacts->listThreads('[email protected]', q: 'invoice'); $activity = $client->contacts->activity(    '[email protected]',    minutes: 30 * 24 * 60,    grain: 'day',    offsetMinutes: intdiv((int) date('Z'), 60),); echo count($threads), ' threads, ', $activity['totals']['waiting'], ' waiting on you', PHP_EOL;

activity は名前付き引数を受け取ります。minutes: は期間を設定し、省略すると 90 日です。grain: は区間の幅を設定し、minute、hour、day のいずれかです。offsetMinutes: は日の区切りを UTC から東に何分ずらすかを設定します。intdiv((int) date('Z'), 60) が、PHP に設定されたタイムゾーンのオフセットです。