Kontakte
`contacts->list`, `get`, `create`, `save`, `update`, `setAudiences`, `delete`, `deleteMany`, `listPeople`, `setPhoto`, `removePhoto`, `block`, `unblock`, `listThreads` und `activity`.
Jede Methode
$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 gibt die zuletzt gesehenen Kontakte zuerst zurück und Kontakte, an die nie gesendet wurde, zuletzt. source ist auto, wenn die Zeile geschrieben wurde, weil ein Mitglied dieser Adresse eine Nachricht aus dem Composer der App gesendet hat, was eine inhaltlich andere Aussage ist als das bewusste Speichern durch jemanden. Eingehende Mail von einer Adresse schreibt nichts, ein Versand über diese API ebenso wenig.
Das Adressbuch gehört dem Workspace und nicht einer einzelnen Person, ein von irgendeinem Mitglied gespeicherter Kontakt ist daher der Kontakt, den jedes Mitglied und jeder Schlüssel sieht. create schreibt source als manual und legt den Kontakt beim Schreiben in die Standard-Audience. Nennen Sie eigene Listen in audienceIds, um sie im selben Aufruf zuzuordnen, was zusätzlich audiences:write erfordert, oder fügen Sie den Kontakt später mit audiences->addContact hinzu, das die Seite Audiences behandelt. setAudiences legt in einem Aufruf genau fest, in welchen Listen ein Kontakt ist.
Adressen werden in Kleinbuchstaben gespeichert, und der Client kodiert die übergebene Adresse, [email protected] erreicht daher die richtige Zeile. Eine leere Adresse wirft eine InvalidArgumentException, bevor etwas gesendet wird. Die Adresse ist die Identität, update kann sie daher nicht ändern: Einen Kontakt zu verschieben heißt delete und create.
Parameter: contacts->list
limitint- Wie viele Kontakte pro Seite zurückgegeben werden: eine ganze Zahl von 1 bis 200, Standard 50. Ein Wert außerhalb des Bereichs ergibt einen 422 statt eines begrenzten Werts. Das Argument ist als `int` typisiert, wandeln Sie einen aus einem Query-String gelesenen Wert also zuerst mit `(int)` um.
cursorstring- Der `nextCursor` der vorherigen Seite. Bauen Sie nie selbst einen: Ein Cursor, der einen nicht mehr existierenden Kontakt nennt, ergibt einen 400 `invalid_cursor`, geworfen als `InvalidRequestException`. Das bedeutet, dass Ihr Paging-Zustand veraltet ist und der Durchlauf ohne Cursor neu beginnen sollte.
sourcestring- `manual` für die Kontakte, die jemand bewusst gespeichert hat, `auto` für die, die der Composer der App aufgezeichnet hat. Lassen Sie es weg, um das gesamte Adressbuch zu erhalten.
qstring- Durchsucht Name und Adresse, bis zu 200 Zeichen. Passt auf der ersten Seite nichts genau, kommen stattdessen ähnliche Schreibweisen zurück, und die folgenden Seiten suchen auf dieselbe Weise weiter.
Antwort: ein Kontakt
contacts->list gibt eine OpenEmail\Result\Page zurück, die Zeilen liegen daher auf $page->items, und der Durchlauf folgt $page->nextCursor, solange $page->hasMore true ist. listAll gibt alle Zeilen als ein einziges Array zurück, und iterate gibt einen Generator zurück, der sie einzeln liefert. get, create, update, save und setAudiences geben jeweils einen Kontakt als Array mit camelCase-Schlüsseln zurück, dieselbe Zeile plus audiences. Das Adressbuch ist unbegrenzt, deshalb paginiert diese Route, statt ein Array zurückzugeben, das stillschweigend bei 200 endet.
objectstring- Immer der String `contact`, auf den Listenzeilen ebenso wie bei `get`.
emailstring- Die Adresse, beim Schreiben in Kleinbuchstaben umgewandelt, sodass `[email protected]` und `[email protected]` ein Kontakt sind, und zugleich der Schlüssel, den jede contacts-Methode entgegennimmt, da keine Kontakt-id nach außen gegeben wird. Zeilen gehören dem Workspace und nicht dem Mitglied oder dem Schlüssel, der sie geschrieben hat, jedes Mitglied und jeder Schlüssel im Workspace liest und schreibt daher ein einziges Adressbuch.
namestring or null- Der Anzeigename oder null, wenn für die Adresse nie ein Name erfasst wurde. Ein automatischer Schreibvorgang trägt nur dann einen ein, wenn der Header etwas anderes als die Adresse selbst geliefert hat, und er kann niemals einen vom Benutzer eingegebenen Namen überschreiben.
sourcestring- `auto` bedeutet, dass die Zeile geschrieben wurde, weil der Benutzer Mail an diese Adresse gesendet hat. `manual` bedeutet, dass jemand sie von Hand eingetragen hat, eine inhaltlich andere Aussage, und ein Upsert stuft `manual` nie wieder auf `auto` herab. Eingehende Mail von einer Adresse schreibt bewusst gar keine Zeile, wer Ihnen also nur geschrieben hat, steht hier nicht. Behandeln Sie den Wert als offenen String, weil die Spalte Freitext mit dem Standardwert `manual` ist.
notesstring or null- Freitext, den jemand über diese Person geschrieben hat, in der App oder über `update`, nie generiert. null, wenn niemand etwas geschrieben hat, und `'notes' => null` bei `update` löscht ihn.
lastSeenAtstring or null- Ein UTC-String nach ISO 8601, der jedes Mal aktualisiert wird, wenn ein Mitglied aus dem Composer der App an diese Adresse sendet, nicht wenn von ihr Mail eintrifft, was nichts schreibt. null bei einem über `create` gespeicherten Kontakt, an den nie gesendet wurde, und diese stehen in der absteigenden `lastSeenAt`-Sortierung dieser Route am Ende.
audiencesarray- Nur bei `get`, `create`, `update`, `save` und `setAudiences`, nie auf Listenzeilen. Jede Audience, in der der Kontakt ist, die Standard-Audience eingeschlossen, als Array mit `id`, `name` und `builtin`. `builtin` ist `default` bei der Audience, zu der jeder Kontakt gehört, und null bei einer von jemandem angelegten. Verzweigen Sie daher darüber und nicht über den Namen, den jeder ändern kann.
photoUrlstring or null- Wo das Kontaktfoto ausgeliefert wird, oder null, wenn der Kontakt keins hat. `setPhoto` setzt es, und jeder Upload bekommt eine neue URL.
Die Audiences eines Kontakts festlegen
setAudiences($email, ['audienceIds' => [...]]) legt in einer Anfrage genau fest, in welchen Audiences ein Kontakt ist. Der Kontakt tritt jeder genannten Audience bei, in der er noch nicht ist, und verlässt jede andere, und der Aufruf gibt den Kontakt nach der Änderung zurück, mit seinen audiences. Er erfordert audiences:write, weil er Mitgliedschaften schreibt und nicht den Kontakt, und eine Wiederholung ändert nichts. Der Client wiederholt ihn daher nach einem Netzwerkfehler.
Die Standard-Audience bleibt immer erhalten, 'audienceIds' => [] lässt den Kontakt also nur in der Standard-Audience. Es nimmt bis zu 100 ids. Eine id, die keine Audience in diesem Workspace bezeichnet, ergibt einen 404 audience_not_found, und nichts ändert sich, und eine Adresse, die kein Kontakt ist, ergibt einen 404 contact_not_found. Beide werfen eine NotFoundException.
Alle auf der Kontaktseite
listPeople listet die Personen, die die Kontaktseite der App zeigt: die gespeicherten Kontakte und jede in Mails gesehene Adresse, jeweils mit saved, threads und lastAt, und gibt eine OpenEmail\Result\PeoplePage zurück, die zu items, hasMore und nextCursor noch seen ergänzt. list liefert dagegen nur die gespeicherten Kontakte. Die in Mails gesehenen Adressen kommen nur, wenn der Schlüssel auch threads:read hat, und $page->seen sagt, ob sie gekommen sind. sort: ist recent, name oder threads, und OpenEmail\Constants\PeopleSorts nennt sie. q: durchsucht Namen, Adressen und Notizen, und blocked: true behält die Personen, die die Blockliste des Workspace blockiert, Regeln für ganze Domains eingeschlossen. blockedBy nennt die Regel in jeder Zeile.
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 gibt alle Seiten als ein einziges Array zurück, und iteratePeople gibt einen Generator zurück, der jede Person liefert. Keines von beiden meldet seen, lesen Sie also eine Seite mit listPeople, um es zu erfahren. Der Cursor ist opak: Übergeben Sie nextCursor genau so, wie er kam, als cursor: zurück, mit denselben sort:, q: und blocked:.
Speichern, Löschen und Fotos
save($email) mit einem optionalen Array aus name und notes entspricht Zu Kontakten hinzufügen und In Kontakten behalten: Es speichert eine Adresse, die noch kein Kontakt ist, behält eine aus einem Versand erfasste als von Hand gespeichert und holt eine gelöschte zurück. delete entspricht Löschen: Es entfernt den gespeicherten Kontakt und blendet die Adresse aus, damit der Composer sie nicht wieder erfasst, und nimmt auch eine Adresse, die nur in Mails vorkam. wasSaved im zurückgegebenen Array sagt, was davon es war. deleteMany löscht bis zu 200 in einem Aufruf.
$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 sendet die Bildbytes unverändert: PNG, JPEG, WebP oder GIF bis 5 MB, eingepasst in ein Quadrat von 512 Pixeln. Die Bytes sind ein String, eine Stream-Ressource aus fopen, eine SplFileInfo oder ein PSR-7-Stream oder eine hochgeladene Datei. Übergeben Sie contentType: oder Bytes, die ihren eigenen Typ mitbringen: eine hochgeladene PSR-7-Datei oder ein Symfony- oder Laravel-Upload mit seinem Medientyp, oder eine Datei oder ein Stream, deren Name auf .png, .jpg, .jpeg, .webp oder .gif endet. Ohne Typ gehen die Bytes als application/octet-stream, was der Server mit einem 422 invalid_image ablehnt. OpenEmail\Constants\ContactPhotoTypes nennt die vier Typen. Die Adresse muss zuerst ein gespeicherter Kontakt sein.
Blockieren
block($email) setzt die Adresse auf die Blockliste des Workspace, sodass Mails von ihr abgewiesen werden, und lässt ein Plus-Tag weg, und unblock($email) nimmt jede Regel ab, die sie blockiert. Beide brauchen settings:write, weil sie die Blockliste ändern und nicht den Kontakt, und bei keinem muss die Adresse ein Kontakt sein.
Hebt unblock eine Regel für eine ganze Domain auf, listet removed sie mit list gleich blockedDomains, und die Blockierung aller bei dieser Domain wird mit ihr aufgehoben. OpenEmail\Constants\ContactBlockLists nennt beide Listen.
Unterhaltungen und Aktivität
listThreads($email) blättert durch die Threads, die die Adresse geschrieben hat oder die an sie gingen, in jedem Ordner, und listAllThreads und iterateThreads durchlaufen sie. activity($email) liefert die Zahlen hinter dem Tab Aktivität eines Kontakts: empfangen und gesendet pro Abschnitt, Threads, die auf Ihre Antwort warten, und die mittlere Antwortzeit in beide Richtungen. Beide brauchen threads:read.
$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 nimmt benannte Argumente. minutes: legt das Fenster fest, das ohne Angabe 90 Tage beträgt. grain: legt die Breite der Abschnitte fest: minute, hour oder day. offsetMinutes: legt die Minuten östlich von UTC fest, an denen die Tage umbrechen, und intdiv((int) date('Z'), 60) ist der Offset der Zeitzone, auf die PHP eingestellt ist.