Threads, Entwürfe und Labels
Jeder Befehl in den Namespaces threads, drafts und labels, und wie sie unter inbox, read, archive und den anderen Mail-Befehlen liegen.
Überblick
Die Mail-Befehle wie inbox, read, archive und label add sind für Menschen geschrieben: Sie nehmen mehrere Thread-IDs auf einmal, formatieren ihre Ausgabe und halten die Label-IDs aus dem Blick. Jeder von ihnen führt Befehle von dieser Seite aus, und das sind die SDK-Methoden für Threads, Entwürfe und Labels, ein Befehl pro Methode, threads.listAttachments ist also openemail threads list-attachments.
Nutzen Sie diese, wenn Sie brauchen, was die Mail-Befehle auslassen: einen Thread genau so, wie die API ihn zurückgibt, die Dateien einer Nachricht, Entwürfe und das Anlegen, Umbenennen, Umfärben oder Löschen von Labels.
openemail threadundopenemail draftfunktionieren genauso wie die Pluralnamen.openemail labelshat keine Singularform:openemail labelist der Mail-Befehl, der Labels an Threads setzt.- Die Verben nehmen die üblichen Aliasse:
lsfürlist,showundviewfürget,newundaddfürcreate,editfürupdateundrm,delundremovefürdelete. - Jedes Flag steht in
openemail <namespace> <verb> --help, etwaopenemail threads list --help.
Threads
Unterhaltungen im Postfach. Eine Thread-ID wie CAHk7pQ2x9LmZ4 stammt aus threads list, openemail inbox oder openemail search.
| Befehl | Was es tut |
|---|---|
| openemail threads list | Eine Seite Threads in einem Ordner auflisten, neueste zuerst. Jede Zeile ist nur eine ID. --folder, --query, --label-ids, --sort, --date-from, --date-to und --from-contacts grenzen sie ein und ordnen sie |
| openemail threads get <id> | Einen Thread mit jeder Nachricht darin lesen, älteste zuerst, mit seinen Labels und seinem Ungelesen-Status |
| openemail threads update <id> | Einen Thread mit --read als gelesen oder mit --no-read als ungelesen markieren und mit --add-label-ids und --remove-label-ids Labels setzen oder entfernen, bis zu 50 pro Flag |
| openemail threads trash <id> | Einen Thread in einem Schritt in den Papierkorb verschieben, heraus aus Posteingang, Spam, Zurückgestellt und Archiv. Fragt nach einer Bestätigung |
| openemail threads snooze <id> <wake-at> | Einen Thread bis zu einem künftigen Zeitpunkt ausblenden, etwa 2026-10-01T09:00:00Z. Erneutes Zurückstellen ersetzt den Weckzeitpunkt |
| openemail threads unsnooze <id> | Einen zurückgestellten Thread jetzt in den Posteingang zurückholen und seinen Weckzeitpunkt löschen |
| openemail threads list-attachments <id> <message-id> | Die Anhänge einer Nachricht auflisten, jeweils mit ihren Bytes inline als base64 in content |
--folderist standardmäßiginboxund wird als Label-ID abgeglichen, daher funktionierensent,archive,spam,trash,draft,snoozed,starredundunread,binwird alstrashgelesen, und eine Benutzer-Label-ID wieUSER_RECEIPTSfunktioniert auch. Ein Ordner, auf den nichts passt, liefert eine leere Seite, keinen Fehler.--querynimmt die Suchsyntax der App, undin:anywheredurchsucht jeden Ordner.--label-idsgrenzt weiter ein, denn ein Thread muss den Ordner und jede übergebene ID tragen.--date-fromund--date-tolesen die neueste Nachricht jedes Threads, und beide Grenzen sind eingeschlossen.threads getzählt ungesendete Antwortentwürfe zu den Nachrichten, markiert mitisDraft: true, und öffnet auch eine Entwurfs-ID.threads updatebraucht--read,--no-readoder ein Label zum Hinzufügen oder Entfernen. Entfernungen werden vor Hinzufügungen angewendet. Eine Label-ID, die kein Label benennt, wird mitlabel_not_foundabgelehnt, und am Thread ändert sich nichts, legen Sie das Label also zuerst an.TRASH,SNOOZEDundDRAFTwerden mitlabel_not_directly_settableabgelehnt: Verwenden Siethreads trashundthreads snooze.threads trashlöscht nichts, und der Thread bleibt mitthreads getlesbar, aber kein Befehl holt einen Thread wieder aus dem Papierkorb. Das Verschieben eines zurückgestellten Threads in den Papierkorb bricht auch sein Wecken ab.threads snoozesendet<wake-at>unverändert, geben Sie also einen künftigen ISO-8601-Zeitpunkt mitZoder einem Offset an, denn eine Zeit ohne beides wird in der Zeitzone des Servers gelesen. Eine Verzögerung wie3hwird als ungültig abgelehnt.openemail snooze --until 3hnimmt eine Verzögerung. Threads werden bei einem stündlichen Durchlauf geweckt, bis zu etwa einer Stunde zu spät, und immer in den Posteingang.threads list-attachmentsgibt jede Datei vollständig in einer Antwort zurück. Nehmen Sie die Nachrichten-ID aus denmessagesvonthreads get.contentist ein leerer String, wenn die gespeicherten Bytes nicht gefunden werden, prüfen Sie also seine Länge vor dem Dekodieren.
Entwürfe
Ungesendete Nachrichten, die im Postfach gespeichert sind. Eine Entwurfs-ID beginnt mit draft-.
| Befehl | Was es tut |
|---|---|
| openemail drafts list | Eine Seite Entwürfe auflisten, zuletzt gespeicherte zuerst. Jede Zeile ist nur eine ID, und --query durchsucht sie |
| openemail drafts get <id> | Empfänger, Betreff, Body und Absender eines Entwurfs lesen, dazu den Thread, auf den er antwortet, und die Namen seiner Anhänge |
| openemail drafts create | Einen neuen Entwurf aus --to, --cc, --bcc, --subject, --html, --text, --from und --thread-id speichern, alle optional |
| openemail drafts update <id> | Felder eines gespeicherten Entwurfs ändern. Ein weggelassenes Feld behält seinen Wert |
| openemail drafts delete <id> | Einen Entwurf endgültig löschen. Er landet nicht im Papierkorb. Fragt nach einer Bestätigung |
drafts list --querydurchsucht Betreff, Absender und den Anfang des Bodys und verlässt nie die Entwürfe.older_than:30dund die anderen Datumsoperatoren lesen, wann der Entwurf zuletzt gespeichert wurde, undto:,cc:undbcc:treffen bei einem Entwurf nichts.- Ein Entwurf wird als Thread mit dem Label
DRAFTgespeichert, daher öffnetthreads geteinen, undopenemail inbox draftlistet sie auf.drafts get,updateunddeletelehnen eine gewöhnliche Thread-ID mit einem 404 ab. - Ein bloßes
openemail drafts createspeichert einen leeren Entwurf. Geprüft werden nur Längen: ein Betreff bis 998 Zeichen und--htmlund--textbis jeweils 1.000.000, wobei--htmlbehalten wird, wenn beide gesetzt sind. Es gibt kein Flag für Anhänge. drafts updateersetzt jedes Feld, das Sie senden. Eine Liste ersetzt die gespeicherte vollständig,--tomit einer Adresse lässt die anderen also fallen, und ein Update leert die Anhangsliste des Entwurfs.--thread-idhält fest, auf welchen Thread ein Entwurf antwortet, aber der Entwurf wird trotzdem als eigener Thread gespeichert.- Ein erneutes
drafts createspeichert einen zweiten Entwurf, weil es keinen Idempotency-Key nimmt. Ein Anzeigename mit einem Komma darin zerfällt in zwei kaputte Empfänger, lassen Sie das Komma also weg. openemail send --draft <id> --to <address>sendet einen Entwurf. Der Body kommt aus dem Entwurf, ebenso der Betreff, außer Sie übergeben--subject, während die Empfänger die sind, die Sie nennen. Es lässt sich nicht mit einem Body,--templateoder--translatekombinieren.
Labels
Die Labels, die ein Thread tragen kann. Eine Benutzer-Label-ID ist USER_ gefolgt von dem Namen, mit dem es angelegt wurde, in Großbuchstaben, wobei jede Folge von Leerraum zu _ wird, Big Clients ist also USER_BIG_CLIENTS.
| Befehl | Was es tut |
|---|---|
| openemail labels list | Die Benutzer-Labels des Workspace auflisten, nach Namen sortiert, jeweils mit Farbe, threadCount, createdAt und updatedAt |
| openemail labels list-colors | Die Palette der App auflisten, vierzehn Volltonfarben und sieben Verläufe. value ist das, was Sie als Farbe übergeben |
| openemail labels get <id> | Ein Benutzer-Label lesen, dessen ID unter Beachtung der Groß- und Kleinschreibung abgeglichen wird |
| openemail labels create --name <value> | Ein Benutzer-Label anlegen. --color-background-color gibt ihm eine Farbe |
| openemail labels update <id> | Ein Label umbenennen oder umfärben. Die ID bleibt, ebenso die Threads, die es tragen |
| openemail labels delete <id> | Ein Label löschen und von jedem Thread entfernen, der es trug. Fragt nach einer Bestätigung |
- Eine ID ändert sich nie, auch nicht nach einer Umbenennung, speichern Sie also IDs statt Namen.
- System-Labels wie
INBOX,STARREDundUNREADwerden nicht aufgelistet und lassen sich nicht ändern oder löschen, obwohlthreads updatesie nimmt.labels getauf eines davon ist ein 404. - Ein Workspace fasst bis zu 50 Benutzer-Labels. Ein Name, den ein anderes Label schon hat, ohne Beachtung der Groß- und Kleinschreibung verglichen, wird mit
label_name_takenabgelehnt. - Eine Farbe ist ein Hex-Wert wie
#3B82F6oder ein Verlaufs-Token wiegradient:sunset.--label-colornimmt die ganze Farbe als JSON, und--label-color nulllöscht sie. - Ein Label gehört dem Workspace, Umbenennen, Umfärben oder Löschen ändert es also für alle darin.
labels deletelässt sich nicht rückgängig machen. Ein neues Label mit demselben Namen bekommt dieselbe ID, aber die Threads bekommen es nicht zurück. SeinthreadCountinlabels getsagt, wie viele Unterhaltungen es verlieren werden.
Wie die Mail-Befehle sie nutzen
| Mail-Befehl | Was er ausführt |
|---|---|
| inbox [folder] | threads list für eine Seite, dann threads get für jeden Thread, sechs gleichzeitig |
| search <query...> | threads list --query, dann threads get für jeden Thread |
| read <thread-id> | threads get, dann threads update --read, außer Sie übergeben --no-mark-read |
| reply <thread-id> | threads get für Empfänger, Betreff und Absenderadresse, dann emails send in den Thread |
| archive <thread-id...> | threads update --add-label-ids ARCHIVE --remove-label-ids INBOX |
| unarchive <thread-id...> | threads update --add-label-ids INBOX --remove-label-ids ARCHIVE |
| star, unstar <thread-id...> | threads update, das STARRED hinzufügt oder entfernt |
| mark read, unread <thread-id...> | threads update --read oder --no-read |
| trash <thread-id...> | threads trash |
| snooze <thread-id...> --until <when> | threads snooze, wobei eine Verzögerung wie 3h zuerst in einen Zeitpunkt umgerechnet wird |
| unsnooze <thread-id...> | threads unsnooze |
| label add, remove <thread-id...> | threads update --add-label-ids oder --remove-label-ids |
| send --draft <id> | emails send --draft-id |
- Ein Mail-Befehl nimmt mehrere Thread-IDs und meldet für jede ein Ergebnis, und mit
--jsongibt er{ results, succeeded, failed }aus. Ein Befehl auf dieser Seite nimmt eine ID und gibt aus, was die API zurückgibt. openemail inboxliest jeden Thread, den es auflistet, um zu zeigen, wer zuletzt geschrieben hat, und den Betreff.threads liststellt eine Anfrage pro Seite und gibt nur IDs aus, und mehr braucht eine Pipeline nicht.openemail readmacht aus einer HTML-Nachricht Text und markiert den Thread als gelesen.threads getgibt den Thread so aus, wie die API ihn zurückgibt, und ändert nichts.
Beispiele
Einen Thread in einer Anfrage als gelesen markieren, archivieren und mit einem Label versehen, wo mark read, archive und label add drei bräuchten:
openemail threads update CAHk7pQ2x9LmZ4 --read --add-label-ids ARCHIVE,USER_RECEIPTS --remove-label-ids INBOX --jsonEin Label anlegen und jeden passenden Thread darunter ablegen. Weitergeleitet gibt --all ein JSON-Objekt pro Zeile aus:
openemail labels create --name Receipts --color-background-color gradient:meadowopenemail threads list --query "in:anywhere subject:receipt newer_than:1y" --all | jq -r .id | xargs openemail label add --label USER_RECEIPTSEine Datei aus einer Nachricht speichern. Die Nachrichten-IDs stehen in den messages von threads get:
openemail threads get CAHk7pQ2x9LmZ4 --json | jq -r ".messages[].id"openemail threads list-attachments CAHk7pQ2x9LmZ4 message_4c1b257a --json | jq -r '.[] | select(.filename == "invoice.pdf") | .content' | base64 --decode > invoice.pdfEinen Entwurf schreiben, ändern, zurücklesen und dann senden:
DRAFT=$(openemail drafts create --to [email protected] --subject "Engine notes for Thursday" --html "<p>Agenda below.</p>" --json | jq -r .id)openemail drafts update "$DRAFT" --to [email protected],[email protected]openemail drafts get "$DRAFT"openemail send --draft "$DRAFT" --from [email protected] --to [email protected],[email protected]Entwürfe aufräumen, die seit 30 Tagen niemand gespeichert hat. Der Probelauf gibt jedes DELETE aus, ohne es zu senden, und --yes beantwortet die Bestätigung:
openemail drafts list --query older_than:30d --all | jq -r .id > stale.txtxargs -n 1 openemail drafts delete --dry-run < stale.txtxargs -n 1 openemail drafts delete --yes < stale.txtEinen Verlauf aus der Palette wählen, die Änderung in der Vorschau ansehen, sie vornehmen und die Farbe später wieder entfernen:
openemail labels list-colors --json | jq -r '.[] | select(.kind == "gradient") | .value'openemail labels update USER_RECEIPTS --name "Receipts 2026" --color-background-color gradient:aurora --dry-runopenemail labels update USER_RECEIPTS --name "Receipts 2026" --color-background-color gradient:auroraopenemail labels update USER_RECEIPTS --label-color nullScopes und Bestätigungscodes
| Scope | Befehle |
|---|---|
| threads:read | threads list, get und list-attachments |
| threads:write | threads update, trash, snooze und unsnooze |
| drafts:read | drafts list und get |
| drafts:write | drafts create, update und delete |
| labels:read | labels list, list-colors und get |
| labels:write | labels create, update und delete |
Ein fehlender Scope bricht mit Exit-Code 4 ab. Keiner dieser Befehle fragt nach einem Bestätigungscode, weder mit einer Browser-Anmeldung noch mit einem API-Schlüssel.
Eine Anmeldung oder ein Schlüssel, die auf einige Adressen beschränkt sind, sehen nur die Threads, die an diese zugestellt wurden, und jeder andere Thread ist ein 404, als gäbe es ihn nicht. Labels gehören dem Workspace, daher sehen sie trotzdem jedes Label, aber threadCount zählt nur die Unterhaltungen, die sie sehen können.
Seiten, Bestätigungen und Probeläufe
threads list,drafts listundlabels listlesen eine Seite, 25 Einträge, sofern--limitnichts anderes sagt, bis zu 100.--cursormacht beim Cursor weiter, den eine Seite ausgegeben hat. Ein Thread-Cursor behält die Reihenfolge, in der er ausgegeben wurde, senden Sie also dieselben Filter mit.--allliest jede Seite, und--max <n>hört nach so vielen auf. Weitergeleitet oder mit--ndjsongibt es ein JSON-Objekt pro Zeile aus, und mit--jsonein einziges{ items, hasMore, nextCursor }-Dokument.hasMorekann auf der Seite true sein, die sich als letzte herausstellt, und der nächste Aufruf liefert dann keine Einträge. Ein Thread, der während des Blätterns neue Mail bekommt, rückt vor den Cursor und wird von späteren Seiten nicht geliefert, ebenso ein Entwurf, der während des Blätterns gespeichert wird.threads trash,drafts deleteundlabels deletebitten um Bestätigung. Unbeaufsichtigt, mit--json,--no-inputoder ohne Terminal, brechen sie mit Exit-Code2ab und ändern nichts, außer Sie übergeben--yes.--dry-rungibt die Anfrage aus, die ein Befehl senden würde, mit geschwärzten Anmeldedaten, und endet mit Exit-Code0, ohne sie zu senden oder um Bestätigung zu bitten. Mit--jsongibt es{ dryRun, request }aus.
JSON-Bodys und das Leeren eines Felds
--data nimmt den ganzen Body als JSON, inline, aus einer Datei mit @path oder von stdin mit -, und ein Flag, das Sie zusätzlich übergeben, überschreibt seinen Schlüssel.
Ein leerer Flag-Wert ist ein Nutzungsfehler, ein Feld, das ein leerer Wert leert, geht also stattdessen über --data. --label-color null löscht die Farbe eines Labels.
openemail drafts update draft-5f0c2a9e-8b1d-4e7a-a3c6-2d9f41b7e0c8 --data '{"from":""}'openemail drafts update draft-5f0c2a9e-8b1d-4e7a-a3c6-2d9f41b7e0c8 --data '{"threadId":""}'openemail drafts update draft-5f0c2a9e-8b1d-4e7a-a3c6-2d9f41b7e0c8 --data '{"to":[]}'openemail drafts create --data @draft.json --subject "Overrides the file"Der erste speichert den Entwurf ohne Absender, der zweite löst ihn von dem Thread, auf den er antwortete, und der dritte leert seine Empfänger.
Jedes Flag
openemail threads --helpopenemail threads list --helpopenemail drafts create --help --jsonopenemail <namespace> <verb> --help zeigt jedes Argument und Flag mit seinem Typ, die Scopes, die der Aufruf braucht, Methode und Pfad, was er zurückgibt, und die Hinweise aus der API-Referenz. Fügen Sie --json hinzu, um dieselbe Hilfe als Daten zu erhalten.