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

openemail threads

この名前空間のすべてのコマンドと、その引数、フラグ、例。

コマンド

Read, search, label, trash and snooze conversations in the mailbox.

ここのすべてのコマンドは、--json、--profile、--dry-run などのグローバルフラグも受け付けます。 グローバルフラグを見る

openemail threads list

List one page of threads in a folder

スコープthreads:readサインインが必要エイリアスls

使い方

openemail threads list [flags]

Returns one page of threads from the mailbox index, ordered by each thread's latest message with the newest first unless sort says otherwise. A row is only object and id, so call get for the messages, labels and unread state.

sort, --date-from, --date-to and --from-contacts are the thread list's own controls: the four orders, a date range read against the newest message on each thread, and a filter to mail from saved contacts. Every order pages to the end, and a cursor carries on in the order it was handed out in, so send the same filters with it.

folder defaults to inbox and is matched against label ids after being upper cased, so sent, archive, spam, trash, draft, snoozed, starred and unread all work, bin is read as trash, and a user label id works as a folder too. A name that matches nothing returns an empty page rather than an error. --label-ids narrows the folder further: a thread must carry the folder label and every id you pass.

query takes the mailbox search syntax. Plain words must all appear, and each matches loosely: case, accents and separators are ignored and part of a longer word counts, so min finds "Benjamin". A quoted phrase is matched as written apart from case and accents, so "ben jamin" does not find "Ben-Jamin" while "quarterly invoice" finds "Quarterly invoice". When nothing matches exactly, close spellings are returned instead, so benjimin finds "Benjamin": a plain word, or the value of from:, to:, cc:, subject:, body:, filename: or label:, may differ from the start of a word by one typo when it has four to seven letters and by two when it has eight or more, while a quoted phrase, a word containing a digit, a shorter word and an excluded word still match exactly, and the pages that follow keep matching the same way. Filler words such as the, about or emails are dropped from a list of plain words when something else is left to search for, so emails from john searches for john alone. Operators such as from:, to:, subject:, label:, is:unread, has:pdf, after:2026/01/31 and newer_than:7d narrow it, and OR, parentheses and a leading - combine them. Recipients are stored as one list without roles and never hold a Bcc, so cc: reads the same field as to: and bcc: matches nothing of its own. from:me is mail you sent, and to:me is mail carrying one of your own addresses, aliases included, among its recipients or as the address it was delivered to.

Words and the from:, to:, cc:, subject: and body: operators read only the newest message on each thread: its sender, its recipients, its subject and the first 4,000 characters of its body with markup stripped. filename: and has: read every attachment on the whole conversation, and label:, in: and is: read the whole conversation. A plain word also matches the name of any attachment on the conversation, whichever message carried it. A sealed message has no body text to match. The search stays inside folder unless the query names a folder itself, with in: or a folder is: such as is:sent, and in:anywhere searches every folder, on its own as well as beside other terms. A drafts listing is the exception and stays in drafts whatever the query names.

Dates read the newest activity on the thread, in UTC. after: includes the day it names and before: excludes it, and a date can be written YYYY/MM/DD, YYYY-MM-DD, YYYYMMDD, as a bare year, or as epoch seconds or milliseconds. A short date reads day first (16/09/2026), unless the second number cannot be a month (09/16/2026), and a number above 12 settles it either way. The API pages with an opaque pageToken, which the SDK hands back as nextCursor and accepts as --cursor.

Add --all to walk every page: a table on a terminal, one JSON object per line when piped or with --ndjson, and one { items, hasMore, nextCursor } document with --json. --max <n> stops after that many items.

フラグ

--folder <value>

Label the threads must carry, case insensitive. Defaults to inbox, and bin is read as trash.

既定値"inbox"
--query <value>

Mailbox search. Plain words must all appear and match loosely, a quoted phrase has to appear as written, filler words are dropped when something else is left to search for, and operators such as from:ada, has:pdf and in:anywhere narrow it.

--label-ids <a,b>複数指定可

Label ids a thread must all carry on top of folder, matched exactly. An array is sent comma separated.

--sort <value>

newest (the default), oldest, sender or subject, the four orders of the thread list in the app. sender and subject are alphabetical, newest first within one sender or subject.

既定値"newest"
--date-from <when>

Keeps threads whose newest message arrived at or after this instant. A Date or an ISO 8601 string with a time and an offset.

--date-to <when>

Keeps threads whose newest message arrived at or before this instant. Both ends are included, and --date-from after --date-to is a 422.

--from-contacts

When true, keeps only threads whose newest message came from a saved contact. A key limited to some addresses reads the contacts its owner saved.

--limit <n>

Threads per page, a whole number from 1 to 100. Defaults to 25.

--cursor <value>

The nextCursor of the previous page, passed back unchanged.

--all

Fetch every page and stream the items as they arrive.

--max <n>

Stop after this many items. Implies --all.

--ndjson

Print every item as one JSON object per line. Implies --all

例

openemail threads list
With optional flags
openemail threads list --folder inbox --query 'from:ada has:pdf' --sort oldest
Walk every page and stop after 100 items
openemail threads list --all --max 100
One JSON object per line when piped
openemail threads list --all > threads.ndjson

ほかの提供先

API
GET /threads
SDK
threads.list()

openemail threads get

Read a thread with every message on it

スコープthreads:readサインインが必要エイリアスshowview

使い方

openemail threads get <id> [flags]

Returns the whole conversation, oldest message first, with the labels the thread sits in and its unread state. Unsent draft replies are included in messages with isDraft: true, which is why messageCount, the length of messages, can be higher than totalReplies, which counts only real messages.

Messages are passed through as the mailbox stored them, so MessageResource is an open record rather than a fixed field list. The one field the API commits to is encryption. When encryption.format is pgp-mime, pgp-inline or smime-encrypted, the message is sealed and its body is empty or holds armour. pgp-signed and smime-signed are ordinary readable mail. A message with no encryption at all was stored before detection existed, so its absence says nothing about whether it was plaintext.

Each message's tags and unread are overwritten on read with the thread's current labels and unread flag, so they describe the thread and not that one message.

引数

<id>必須

Thread id, as returned by list or carried on a message.

例

openemail threads get CAHk7pQ2x9LmZ4-mail.example.com
Print the raw JSON
openemail threads get CAHk7pQ2x9LmZ4-mail.example.com --json

ほかの提供先

API
GET /threads/{id}
SDK
threads.get()

openemail threads update

Mark a thread read or unread and change its labels

スコープthreads:writeサインインが必要エイリアスedit

使い方

openemail threads update <id> [flags]

Adds and removes labels on a thread in one call. read is shorthand for the UNREAD label: true removes it and false adds it. At least one of read, a non empty --add-label-ids or a non empty --remove-label-ids is required, each list takes at most 50 ids, and any other key is a 422 because the body is strict.

Folders are labels too, so archiving is addLabelIds: ['ARCHIVE'] with removeLabelIds: ['INBOX'], the same pair the app uses. TRASH, SNOOZED and DRAFT are refused in either list with 422 label_not_directly_settable, because each needs a step this route cannot take. Use trash and snooze for those.

User label ids come from labels.list, and the system ids such as ARCHIVE, STARRED and UNREAD are taken in any case. An id in --add-label-ids that names no label is refused with 422 label_not_found and nothing on the thread changes, so create the label with labels.create first. An unknown id in --remove-label-ids is not an error, since the thread cannot carry it. Removals are applied before additions, so an id in both lists ends up on the thread.

引数

<id>必須

Thread id.

フラグ

--read

true removes UNREAD, false adds it.

--add-label-ids <a,b>複数指定可

Label ids to put on the thread, at most 50, each naming a label, never TRASH, SNOOZED or DRAFT.

--remove-label-ids <a,b>複数指定可

Label ids to take off the thread, at most 50, never TRASH, SNOOZED or DRAFT.

--data <json|@file|->

The whole patch as JSON, inline, from a file with @path, or - for standard input. Flags override its keys.

例

With optional flags
openemail threads update CAHk7pQ2x9LmZ4-mail.example.com --read --add-label-ids ARCHIVE,USER_RECEIPTS --remove-label-ids INBOX
Print the raw JSON
openemail threads update CAHk7pQ2x9LmZ4-mail.example.com --read --add-label-ids ARCHIVE,USER_RECEIPTS --remove-label-ids INBOX --json

ほかの提供先

API
PATCH /threads/{id}
SDK
threads.update()

openemail threads trash

Move a thread to the Bin

スコープthreads:writeサインインが必要
確認を求めます

使い方

openemail threads trash <id> [flags]

Adds TRASH and removes INBOX, SPAM, SNOOZED and ARCHIVE in one step, which is what the app's delete does. Doing half of that through update would leave the thread listed in both the Bin and its old folder, which is why update refuses TRASH.

Nothing is deleted. The thread stays readable with get and lists under folder: 'trash'. Calling this on a thread that is already in the Bin changes nothing and returns the same body, which is why the SDK retries it.

引数

<id>必須

Thread id.

例

openemail threads trash CAHk7pQ2x9LmZ4-mail.example.com
Skip the confirmation, for scripts
openemail threads trash CAHk7pQ2x9LmZ4-mail.example.com --yes

ほかの提供先

API
POST /threads/{id}/trash
SDK
threads.trash()

openemail threads snooze

Hide a thread until a set time

スコープthreads:writeサインインが必要

使い方

openemail threads snooze <id> <wake-at> [flags]

Adds SNOOZED, removes INBOX and stores a wake time, all in one call. Both halves matter: the label hides the thread and the stored wake time is what brings it back. A thread labelled SNOOZED any other way would never return, which is why update refuses that label.

wakeAt takes a Date or an ISO 8601 string. The SDK converts a Date with toISOString(), and the server answers 422 invalid_parameter on wakeAt when the value does not parse or is not in the future. Snoozing a thread that is already snoozed replaces its wake time.

Threads are woken by an hourly sweep, so one comes back at the first sweep after wakeAt, up to about an hour late. Opening the Snoozed folder in the app wakes overdue threads straight away. A thread always wakes into the inbox.

引数

<id>必須

Thread id.

<wake-at>必須

When the thread should return, a future instant.

例

openemail threads snooze CAHk7pQ2x9LmZ4-mail.example.com 2026-10-01T00:00:00Z
Print the raw JSON
openemail threads snooze CAHk7pQ2x9LmZ4-mail.example.com 2026-10-01T00:00:00Z --json

ほかの提供先

API
POST /threads/{id}/snooze
SDK
threads.snooze()

openemail threads unsnooze

Bring a snoozed thread back now

スコープthreads:writeサインインが必要

使い方

openemail threads unsnooze <id> [flags]

Adds INBOX, removes SNOOZED and deletes the stored wake time, so the thread returns immediately and the hourly sweep leaves it alone afterwards.

A thread that is not snoozed is left where it is, so an archived thread stays archived, and the response still reports snoozedUntil: null.

引数

<id>必須

Thread id.

例

openemail threads unsnooze CAHk7pQ2x9LmZ4-mail.example.com
Print the raw JSON
openemail threads unsnooze CAHk7pQ2x9LmZ4-mail.example.com --json

ほかの提供先

API
POST /threads/{id}/unsnooze
SDK
threads.unsnooze()

openemail threads list-attachments

List a message's attachments with their content

スコープthreads:readサインインが必要

使い方

openemail threads list-attachments <id> <message-id> [flags]

Returns the attachments of one message with each file's bytes inlined as base64 in content. The thread is checked first and then the message, so a messageId that is not on that thread is a 404 even when it exists elsewhere in the mailbox. Take message ids from the messages of threads.get.

This is the display list. The ciphertext of an encrypted envelope is in it and downloads like any other file, named encrypted-message.asc when it arrived without a name. The PGP/MIME version part and any detached signature are held out on purpose. Every part keeps its id in the message's encryption.parts, and for those two the id is a correlation key only: no route returns their bytes.

Every file comes back whole in a single response, with no size cap and no range reads, so a message carrying large files makes a large response.

引数

<id>必須

Thread id the message belongs to.

<message-id>必須

Message id from that thread's messages.

例

openemail threads list-attachments CAHk7pQ2x9LmZ4-mail.example.com message_4c1b257a
Print the raw JSON
openemail threads list-attachments CAHk7pQ2x9LmZ4-mail.example.com message_4c1b257a --json

ほかの提供先

API
GET /threads/{id}/messages/{messageId}/attachments
SDK
threads.listAttachments()

openemail threads list-notes

List the notes on a thread

スコープthreads:readサインインが必要

使い方

openemail threads list-notes <id> [flags]

Resolves every note on one thread, the Notes panel of the reading pane: pinned notes first, then the rest in the order they were arranged.

Notes are private to a person. A key reads and writes the notes of the workspace owner, and an app those of the person who connected it. A key limited to particular addresses reaches only the notes on threads that arrived at them.

引数

<id>必須

Thread id.

例

openemail threads list-notes CAHk7pQ2x9LmZ4-mail.example.com
Print the raw JSON
openemail threads list-notes CAHk7pQ2x9LmZ4-mail.example.com --json

ほかの提供先

API
GET /threads/{id}/notes
SDK
threads.listNotes()

openemail threads create-note

Add a note to a thread

スコープthreads:writeサインインが必要

使い方

openemail threads create-note <id> --content <value> [flags]
openemail threads create-note <id> --data <json|@file|-> [flags]

Pins a private note to a thread, as the Notes panel does. A new note goes after the others, and pinned keeps it at the top.

Notes are private to a person. A key reads and writes the notes of the workspace owner, and an app those of the person who connected it. A key limited to particular addresses reaches only the notes on threads that arrived at them.

引数

<id>必須

Thread id.

フラグ

--content <value>

The text of the note, up to 20,000 characters. Leading and trailing spaces are trimmed. Required, here or in --data.

--body-color <value>

One of the eight the app offers: default, red, orange, yellow, green, blue, purple or pink. Defaults to default.

--pinned

Keeps the note above the others. Defaults to false.

--data <json|@file|->

The whole body as JSON, inline, from a file with @path, or - for standard input. Flags override its keys.

例

The required values only
openemail threads create-note CAHk7pQ2x9LmZ4-mail.example.com --content 'Waiting on the signed contract before replying.'
With optional flags
openemail threads create-note CAHk7pQ2x9LmZ4-mail.example.com --content 'Waiting on the signed contract before replying.' --body-color yellow --pinned
Read the whole body from a JSON file
openemail threads create-note CAHk7pQ2x9LmZ4-mail.example.com --data @thread.json

ほかの提供先

API
POST /threads/{id}/notes
SDK
threads.createNote()

openemail threads update-note

Change a note

スコープthreads:writeサインインが必要

使い方

openemail threads update-note <id> <note-id> [flags]

Changes the text of a note, its colour or whether it is pinned. Give at least one of the three. A note id that is not on this thread is a 404, even when the note exists on another thread.

引数

<id>必須

Thread id.

<note-id>必須

The note's id, from listNotes.

フラグ

--content <value>

The new text, up to 20,000 characters.

--patch-color <value>

The new colour.

--pinned

Pins or unpins it.

--data <json|@file|->

The whole patch as JSON, inline, from a file with @path, or - for standard input. Flags override its keys.

例

With optional flags
openemail threads update-note CAHk7pQ2x9LmZ4-mail.example.com b3d1f0c2-7a4e-4f7b-9c1d-2e8f6a5b4c3d --no-pinned
Print the raw JSON
openemail threads update-note CAHk7pQ2x9LmZ4-mail.example.com b3d1f0c2-7a4e-4f7b-9c1d-2e8f6a5b4c3d --no-pinned --json

ほかの提供先

API
PATCH /threads/{id}/notes/{noteId}
SDK
threads.updateNote()

openemail threads delete-note

Delete a note

スコープthreads:writeサインインが必要
確認を求めます

使い方

openemail threads delete-note <id> <note-id> [flags]

Deletes a note for good. There is no bin for notes.

引数

<id>必須

Thread id.

<note-id>必須

The note's id, from listNotes.

例

openemail threads delete-note CAHk7pQ2x9LmZ4-mail.example.com b3d1f0c2-7a4e-4f7b-9c1d-2e8f6a5b4c3d
Skip the confirmation, for scripts
openemail threads delete-note CAHk7pQ2x9LmZ4-mail.example.com b3d1f0c2-7a4e-4f7b-9c1d-2e8f6a5b4c3d --yes

ほかの提供先

API
DELETE /threads/{id}/notes/{noteId}
SDK
threads.deleteNote()

openemail threads reorder-notes

Arrange the notes on a thread

スコープthreads:writeサインインが必要

使い方

openemail threads reorder-notes <id> <ids...> [flags]

Sets the order of every note on a thread at once, first to last, as dragging them in the Notes panel does. Pinned notes still come first.

ids has to name every note on the thread exactly once. Anything else is a 422 invalid_parameter on ids, and nothing moves.

引数

<id>必須

Thread id.

<ids...>必須1つ以上

Every note id on the thread, in the order you want them.

例

openemail threads reorder-notes CAHk7pQ2x9LmZ4-mail.example.com CAHk7pQ2x9LmZ4-mail.example.com
Print the raw JSON
openemail threads reorder-notes CAHk7pQ2x9LmZ4-mail.example.com CAHk7pQ2x9LmZ4-mail.example.com --json

ほかの提供先

API
POST /threads/{id}/notes/reorder
SDK
threads.reorderNotes()

openemail threads counts

Count the mail in each folder

スコープthreads:readサインインが必要

使い方

openemail threads counts [flags]

Resolves what the sidebar of the app shows: how many conversations each folder holds and how many of them are unread, and how many inbox conversations arrived at each address of the workspace.

folders has one row per folder, named by its label id in lower case: inbox, sent, spam, archive, trash and snoozed, then unread, whose count is the unread conversations in the inbox. addresses counts the inbox per address the mail was delivered to, with null for mail that recorded none.

A key limited to particular addresses counts only the mail that arrived at them. address narrows every count to one address, and one the key does not reach counts nothing rather than failing.

フラグ

--address <value>

Count only the mail delivered to this address.

例

openemail threads counts
Print the raw JSON
openemail threads counts --json

ほかの提供先

API
GET /threads/counts
SDK
threads.counts()

openemail threads summary

Read the summary of a thread

スコープthreads:readサインインが必要

使い方

openemail threads summary <id> [flags]

Resolves the short AI summary the reading pane shows above a thread. A summary is written once and kept, and written again when a new message arrives, so reading one is cheap.

state is ready with the text in summary, pending while one is being written, or none when there is nothing to summarise, such as a thread holding a message that arrived encrypted, whose body OpenEmail never reads. A pending answer starts the writing, so ask again a few seconds later.

引数

<id>必須

Thread id.

例

openemail threads summary CAHk7pQ2x9LmZ4-mail.example.com
Print the raw JSON
openemail threads summary CAHk7pQ2x9LmZ4-mail.example.com --json

ほかの提供先

API
GET /threads/{id}/summary
SDK
threads.summary()

openemail threads restore

Take a thread out of the Bin

スコープthreads:writeサインインが必要

使い方

openemail threads restore <id> [flags]

Puts a thread back in the inbox, out of the Bin and out of Spam, which is what Restore from Bin and Move to inbox do in the app. It is the undo of trash.

Calling it on a thread that is already in the inbox changes nothing and returns the same body, which is why the SDK retries it.

引数

<id>必須

Thread id.

例

openemail threads restore CAHk7pQ2x9LmZ4-mail.example.com
Print the raw JSON
openemail threads restore CAHk7pQ2x9LmZ4-mail.example.com --json

ほかの提供先

API
POST /threads/{id}/restore
SDK
threads.restore()

openemail threads delete

Delete a thread for good

スコープthreads:writeサインインが必要
確認を求めます
エイリアスrmdelremove

使い方

openemail threads delete <id> [flags]

Deletes every message in a thread, with its attachments, which is what Delete from Bin does in the app. It cannot be undone.

It works on a thread in any folder, so call trash instead when you only mean to throw the thread away: a trashed thread stays readable and restore brings it back.

引数

<id>必須

Thread id.

例

openemail threads delete CAHk7pQ2x9LmZ4-mail.example.com
Skip the confirmation, for scripts
openemail threads delete CAHk7pQ2x9LmZ4-mail.example.com --yes

ほかの提供先

API
DELETE /threads/{id}
SDK
threads.delete()

openemail threads unsubscribe

Unsubscribe from the sender of a thread

スコープthreads:writeサインインが必要
確認を求めます

使い方

openemail threads unsubscribe <id> [flags]

Does what the Unsubscribe button of the reading pane does: finds the subscription behind the newest message of the thread that carries a List-Unsubscribe header and unsubscribes from it the way the sender asks for, with a one-click request or an unsubscribe email. A sender that only offers a page cannot be unsubscribed by a program, so method is link and url is the page a person has to open.

A thread with no unsubscribe header is a 422 unsubscribe_unsupported, and a thread delivered to no address the key covers is a 404.

引数

<id>必須

Thread id.

例

openemail threads unsubscribe CAHk7pQ2x9LmZ4-mail.example.com
Skip the confirmation, for scripts
openemail threads unsubscribe CAHk7pQ2x9LmZ4-mail.example.com --yes

ほかの提供先

API
POST /threads/{id}/unsubscribe
SDK
threads.unsubscribe()

openemail threads get-event

Read the event a thread carries

スコープcalendar:readサインインが必要

使い方

openemail threads get-event <id> [flags]

Returns the calendar event that came with an invitation in the thread, as the invitation card of the reading pane shows it. Answer it with calendar.respondToEvent.

引数

<id>必須

Thread id, as threads.list returns it.

例

openemail threads get-event thr_6d1a9c4e2b7f30d85e1c4a92
Print the raw JSON
openemail threads get-event thr_6d1a9c4e2b7f30d85e1c4a92 --json

ほかの提供先

API
GET /threads/{id}/event
SDK
threads.getEvent()