Zur Dokumentation springen
Ruby

Kontakte

`contacts.list`, `get`, `create`, `save`, `update`, `set_audiences`, `delete`, `delete_many`, `list_people`, `set_photo`, `remove_photo`, `block`, `unblock`, `list_threads` und `activity`.

Jede Methode

usage.rb
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: nil)client.contacts.set_audiences("[email protected]", audienceIds: ["aud_4c1b8e2a7d9f05c36b4e8a71"])client.contacts.delete("[email protected]") puts page.items.size, page.has_more?, contact[:source], contact[:lastSeenAt], saved[:source]

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.add_contact hinzu, das die Seite Audiences behandelt. set_audiences legt in einem Aufruf genau fest, in welchen Listen ein Kontakt ist.

Adressen werden in Kleinbuchstaben gespeichert, und das Gem kodiert die übergebene Adresse, [email protected] erreicht daher die richtige Zeile. Eine nil- oder leere Adresse löst einen ArgumentError aus, 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

limitInteger
Wie viele Kontakte pro Seite zurückgegeben werden: eine ganze Zahl von 1 bis 200, Standard 50. Der Wert wird konvertiert, ein String wie `"100"` aus einem Query-String ist also in Ordnung, und ein Wert außerhalb des Bereichs ergibt einen 422 statt eines begrenzten Werts.
cursorString
Der `next_cursor` der vorherigen Seite. Bauen Sie nie selbst einen: Ein Cursor, der einen nicht mehr existierenden Kontakt nennt, ergibt einen 400 `invalid_cursor`, ausgelöst als `OpenEmail::InvalidRequestError`. 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::Page zurück, die Zeilen liegen daher auf page.items, und der Durchlauf folgt page.next_cursor, solange page.has_more? true ist. list_all gibt alle Zeilen als ein einziges Array zurück, und iterate übergibt sie einzeln. get, create, update, save und set_audiences geben jeweils einen Kontakt als Hash mit Symbol-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 nil
Der Anzeigename oder nil, 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 nil
Freitext, den jemand über diese Person geschrieben hat, in der App oder über `update`, nie generiert. nil, wenn niemand etwas geschrieben hat, und `notes: nil` bei `update` löscht ihn.
lastSeenAtString or nil
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. nil bei einem über `create` gespeicherten Kontakt, an den nie gesendet wurde, und diese stehen in der absteigenden `lastSeenAt`-Sortierung dieser Route am Ende.
audiencesArray<Hash>
Nur bei `get`, `create`, `update`, `save` und `set_audiences`, nie auf Listenzeilen. Jede Audience, in der der Kontakt ist, die Standard-Audience eingeschlossen, als Hash mit `id`, `name` und `builtin`. `builtin` ist `default` bei der Audience, zu der jeder Kontakt gehört, und nil bei einer von jemandem angelegten. Verzweigen Sie daher darüber und nicht über den Namen, den jeder ändern kann.
photoUrlString or nil
Wo das Kontaktfoto ausgeliefert wird, oder nil, wenn der Kontakt keins hat. `set_photo` setzt es, und jeder Upload bekommt eine neue URL.

Die Audiences eines Kontakts festlegen

set_audiences(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. Das Gem 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 lösen OpenEmail::NotFoundError aus.

Alle auf der Kontaktseite

list_people 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::PeoplePage zurück, die zu items, has_more? und next_cursor 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::PEOPLE_SORTS 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.

people.rb
page = client.contacts.list_people(sort: "threads", limit: 50) page.items.each do |person|  client.contacts.save(person[:email]) if !person[:saved] && person[:threads].to_i > 5end blocked = client.contacts.list_all_people(blocked: true)puts page.seen, blocked.size

list_all_people gibt alle Seiten als ein einziges Array zurück, und iterate_people übergibt jede Person an einen Block oder gibt ohne Block einen Enumerator zurück. Keines von beiden meldet seen, lesen Sie also eine Seite mit list_people, um es zu erfahren. Der Cursor ist opak: Übergeben Sie next_cursor genau so, wie er kam, als cursor: zurück, mit denselben sort:, q: und blocked:.

Speichern, Löschen und Fotos

save(email) mit optionalem 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 Hash sagt, was davon es war. delete_many löscht bis zu 200 in einem Aufruf.

photo.rb
client.contacts.save("[email protected]", name: "Grace Hopper") contact = client.contacts.set_photo("[email protected]", File.binread("photo.jpg"), content_type: "image/jpeg")puts contact[:photoUrl] client.contacts.set_photo("[email protected]", Pathname("photo.png")) client.contacts.remove_photo("[email protected]")client.contacts.delete_many(["[email protected]", "[email protected]"])

set_photo sendet die Bildbytes unverändert: PNG, JPEG, WebP oder GIF bis 5 MB, eingepasst in ein Quadrat von 512 Pixeln. Die Bytes sind ein binärer String, ein IO oder ein Pathname. Übergeben Sie content_type: oder Bytes, die ihren eigenen Typ mitbringen: ein Objekt, das auf content_type antwortet, etwa ein Rails-Upload, oder eine File oder ein Pathname, dessen 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::CONTACT_PHOTO_TYPES 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::CONTACT_BLOCK_LISTS nennt beide Listen.

Unterhaltungen und Aktivität

list_threads(email) blättert durch die Threads, die die Adresse geschrieben hat oder die an sie gingen, in jedem Ordner, und list_all_threads und iterate_threads 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.

activity.rb
threads = client.contacts.list_threads("[email protected]", q: "invoice") activity = client.contacts.activity(  "[email protected]",  minutes: 30 * 24 * 60,  grain: "day",  offset_minutes: Time.now.utc_offset / 60) puts threads.items.size, activity.dig(:totals, :waiting)

activity nimmt Keywords in snake_case. minutes: legt das Fenster fest, das ohne Angabe 90 Tage beträgt. grain: legt die Breite der Abschnitte fest: minute, hour oder day. offset_minutes: legt die Minuten östlich von UTC fest, an denen die Tage umbrechen. Time.now.utc_offset / 60 ist der lokale Offset, und das Gem sendet ihn als offsetMinutes der API.