Saltar para a documentação
CLI

Conversas, rascunhos e etiquetas

Cada comando dos espaços de nomes threads, drafts e labels, e como se encaixam sob inbox, read, archive e os outros comandos de correio.

Visão geral

Os comandos de correio, como inbox, read, archive e label add, são escritos para pessoas: aceitam vários ids de conversa de uma vez, formatam o que mostram e mantêm os ids das etiquetas fora de vista. Cada um executa comandos desta página, que são os métodos do SDK para conversas, rascunhos e etiquetas, um comando por método, por isso threads.listAttachments é openemail threads list-attachments.

Use estes quando precisar do que os comandos de correio deixam de fora: uma conversa exatamente como a API a devolve, os ficheiros de uma mensagem, os rascunhos, e criar, mudar o nome, mudar a cor ou eliminar etiquetas.

  • openemail thread e openemail draft funcionam tal como os nomes no plural. openemail labels não tem forma no singular: openemail label é o comando de correio que põe etiquetas nas conversas.
  • Os verbos aceitam os aliases habituais: ls para list, show e view para get, new e add para create, edit para update, e rm, del e remove para delete.
  • Cada opção está em openemail <namespace> <verb> --help, como openemail threads list --help.

Conversas

As conversas da caixa de correio. Um id de conversa como CAHk7pQ2x9LmZ4 vem de threads list, openemail inbox ou openemail search.

ComandoO que faz
openemail threads listListar uma página de conversas de uma pasta, da mais recente para a mais antiga. Cada linha é só um id. --folder, --query, --label-ids, --sort, --date-from, --date-to e --from-contacts filtram-na e ordenam-na
openemail threads get <id>Ler uma conversa com todas as mensagens, da mais antiga para a mais recente, com as etiquetas e o estado de não lida
openemail threads update <id>Marcar uma conversa como lida com --read ou como não lida com --no-read, e pôr ou retirar etiquetas com --add-label-ids e --remove-label-ids, até 50 de cada
openemail threads trash <id>Mover uma conversa para o Lixo, fora da caixa de entrada, do spam, das adiadas e do arquivo num só passo. Pede-lhe confirmação
openemail threads snooze <id> <wake-at>Ocultar uma conversa até um instante futuro, como 2026-10-01T09:00:00Z. Adiá-la de novo substitui a hora de reativação
openemail threads unsnooze <id>Devolver agora uma conversa adiada à caixa de entrada e limpar a sua hora de reativação
openemail threads list-attachments <id> <message-id>Listar os anexos de uma mensagem, cada um com os bytes em linha como base64 em content
  • --folder é inbox por predefinição e é comparado como um id de etiqueta, por isso funcionam sent, archive, spam, trash, draft, snoozed, starred e unread, bin é lido como trash, e um id de etiqueta de utilizador como USER_RECEIPTS também funciona. Uma pasta que não corresponde a nada devolve uma página vazia, não um erro.
  • --query aceita a sintaxe de pesquisa da aplicação, e in:anywhere pesquisa em todas as pastas. --label-ids filtra ainda mais, já que uma conversa tem de ter a pasta e cada id que passar. --date-from e --date-to leem a mensagem mais recente de cada conversa, e ambos os extremos são incluídos.
  • threads get inclui entre as mensagens as respostas em rascunho por enviar, marcadas com isDraft: true, e também abre um id de rascunho.
  • threads update precisa de --read, --no-read ou de uma etiqueta a acrescentar ou retirar. As remoções são aplicadas antes das adições. Um id de etiqueta que não corresponde a nenhuma etiqueta é recusado com label_not_found e nada muda na conversa, por isso crie primeiro a etiqueta. TRASH, SNOOZED e DRAFT são recusados com label_not_directly_settable: use threads trash e threads snooze.
  • threads trash não elimina nada, e a conversa continua legível com threads get, mas nenhum comando tira uma conversa do Lixo. Mover para o Lixo uma conversa adiada cancela também a sua reativação.
  • threads snooze envia <wake-at> tal como está, por isso indique um instante ISO 8601 futuro com Z ou um desvio, porque uma hora sem nenhum dos dois é lida no fuso horário do servidor. Um atraso como 3h é recusado por ser inválido. openemail snooze --until 3h aceita um atraso. As conversas são reativadas numa varredura de hora a hora, até cerca de uma hora mais tarde, e sempre na caixa de entrada.
  • threads list-attachments devolve cada ficheiro inteiro numa só resposta. Tire o id da mensagem dos messages de threads get. content é uma cadeia vazia quando os bytes guardados não são encontrados, por isso verifique o comprimento antes de o descodificar.

Rascunhos

Mensagens por enviar guardadas na caixa de correio. Um id de rascunho começa por draft-.

ComandoO que faz
openemail drafts listListar uma página de rascunhos, do guardado mais recentemente para o mais antigo. Cada linha é só um id, e --query pesquisa entre eles
openemail drafts get <id>Ler os destinatários, o assunto, o corpo e o remetente de um rascunho, a conversa a que responde e os nomes dos anexos
openemail drafts createGuardar um rascunho novo a partir de --to, --cc, --bcc, --subject, --html, --text, --from e --thread-id, todos opcionais
openemail drafts update <id>Alterar campos de um rascunho guardado. Um campo que omitir mantém o valor
openemail drafts delete <id>Eliminar um rascunho de vez. Não vai para o Lixo. Pede-lhe confirmação
  • drafts list --query pesquisa no assunto, no remetente e no início do corpo, e nunca sai dos rascunhos. older_than:30d e os outros operadores de data leem quando o rascunho foi guardado pela última vez, e to:, cc: e bcc: não correspondem a nada num rascunho.
  • Um rascunho é guardado como uma conversa com a etiqueta DRAFT, por isso threads get abre um e openemail inbox draft lista-os. drafts get, update e delete recusam um id de conversa normal com um 404.
  • Um openemail drafts create sem mais nada guarda um rascunho em branco. Só os comprimentos são verificados: um assunto até 998 caracteres, e --html e --text até 1,000,000 cada um, e --html é mantido quando os dois estão definidos. Não há opção para anexos.
  • drafts update substitui cada campo que enviar. Uma lista substitui por inteiro a guardada, por isso --to com um só endereço retira os outros, e uma atualização esvazia a lista de anexos do rascunho.
  • --thread-id regista a conversa a que um rascunho responde, mas o rascunho continua a ser guardado como uma conversa própria.
  • Voltar a executar drafts create guarda um segundo rascunho, porque não aceita chave de idempotência. Um nome a apresentar com uma vírgula divide-se em dois destinatários inválidos, por isso não use a vírgula.
  • openemail send --draft <id> --to <address> envia um rascunho. O corpo vem do rascunho, e o assunto também, a menos que passe --subject, enquanto os destinatários são os que indicar. Não pode ser combinado com um corpo, --template ou --translate.

Etiquetas

As etiquetas que uma conversa pode ter. Um id de etiqueta de utilizador é USER_ seguido do nome com que foi criada, em maiúsculas, com cada sequência de espaços transformada em _, por isso Big Clients é USER_BIG_CLIENTS.

ComandoO que faz
openemail labels listListar as etiquetas de utilizador do espaço de trabalho, ordenadas por nome, cada uma com a cor, threadCount, createdAt e updatedAt
openemail labels list-colorsListar a paleta que a aplicação oferece, catorze cores sólidas e sete gradientes. value é o que deve passar como cor
openemail labels get <id>Ler uma etiqueta de utilizador, com o id comparado distinguindo maiúsculas de minúsculas
openemail labels create --name <value>Criar uma etiqueta de utilizador. --color-background-color dá-lhe uma cor
openemail labels update <id>Mudar o nome ou a cor de uma etiqueta. O id mantém-se, tal como as conversas que a têm
openemail labels delete <id>Eliminar uma etiqueta e retirá-la de todas as conversas que a tinham. Pede-lhe confirmação
  • Um id nunca muda, nem depois de mudar o nome, por isso guarde ids em vez de nomes.
  • As etiquetas do sistema como INBOX, STARRED e UNREAD não são listadas e não podem ser alteradas nem eliminadas, embora threads update as aceite. labels get numa delas dá 404.
  • Um espaço de trabalho tem até 50 etiquetas de utilizador. Um nome que outra etiqueta já tem, comparado sem distinguir maiúsculas, é recusado com label_name_taken.
  • Uma cor é um valor hexadecimal como #3B82F6 ou um token de gradiente como gradient:sunset. --label-color aceita a cor inteira como JSON, e --label-color null limpa-a.
  • Uma etiqueta pertence ao espaço de trabalho, por isso mudar-lhe o nome, a cor ou eliminá-la altera-a para todos os que lá estão.
  • labels delete não pode ser anulado. Criar de novo uma etiqueta com o mesmo nome dá o mesmo id, mas as conversas não a recuperam. O seu threadCount em labels get diz quantas conversas a vão perder.

Como os comandos de correio os usam

Comando de correioO que executa
inbox [folder]threads list para uma página, e depois threads get em cada conversa, seis de cada vez
search <query...>threads list --query, e depois threads get em cada conversa
read <thread-id>threads get, e depois threads update --read, a menos que passe --no-mark-read
reply <thread-id>threads get para os destinatários, o assunto e o endereço de envio, e depois emails send na conversa
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 a acrescentar ou a retirar STARRED
mark read, unread <thread-id...>threads update --read, ou --no-read
trash <thread-id...>threads trash
snooze <thread-id...> --until <when>threads snooze, com um atraso como 3h convertido primeiro num instante
unsnooze <thread-id...>threads unsnooze
label add, remove <thread-id...>threads update --add-label-ids, ou --remove-label-ids
send --draft <id>emails send --draft-id
  • Um comando de correio aceita vários ids de conversa e informa sobre cada um, e com --json mostra { results, succeeded, failed }. Um comando desta página aceita um só id e mostra o que a API devolve.
  • openemail inbox lê cada conversa que lista para mostrar quem escreveu por último e o assunto. threads list faz um pedido por página e mostra só ids, que é tudo o que um pipeline precisa.
  • openemail read transforma uma mensagem HTML em texto e marca a conversa como lida. threads get mostra a conversa tal como a API a devolve e não altera nada.

Exemplos

Marque uma conversa como lida, arquive-a e etiquete-a num só pedido, onde mark read, archive e label add fariam três:

Uma só atualização
openemail threads update CAHk7pQ2x9LmZ4 --read --add-label-ids ARCHIVE,USER_RECEIPTS --remove-label-ids INBOX --json

Crie uma etiqueta e arquive nela cada conversa correspondente. Encaminhado, --all mostra um objeto JSON por linha:

Etiquetar uma pesquisa
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_RECEIPTS

Guarde um ficheiro de uma mensagem. Os ids das mensagens estão nos messages de threads get:

Guardar um anexo
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.pdf

Escreva um rascunho, altere-o, leia-o de novo e depois envie-o:

Rascunho e depois envio
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]

Limpe os rascunhos que ninguém guardou há 30 dias. A simulação mostra cada DELETE sem o enviar, e --yes responde à confirmação:

Rascunhos antigos
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.txt

Escolha um gradiente da paleta, pré-visualize a alteração, faça-a e, mais tarde, retire de novo a cor:

Mudar a cor de uma etiqueta
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 null

Scopes e códigos de verificação

ScopeComandos
threads:readthreads list, get e list-attachments
threads:writethreads update, trash, snooze e unsnooze
drafts:readdrafts list e get
drafts:writedrafts create, update e delete
labels:readlabels list, list-colors e get
labels:writelabels create, update e delete

Um scope em falta para com o código de saída 4. Nenhum destes comandos pede um código de verificação, nem com um início de sessão no navegador nem com uma chave de API.

Um início de sessão ou uma chave limitados a alguns endereços só veem as conversas entregues a esses endereços, e qualquer outra conversa dá 404, como se não existisse. As etiquetas pertencem ao espaço de trabalho, por isso continuam a ver-se todas, mas threadCount conta só as conversas que é possível ver.

Páginas, confirmações e simulações

  • threads list, drafts list e labels list leem uma página, de 25 a menos que --limit indique outra coisa, até 100. --cursor continua a partir do cursor que uma página mostrou. Um cursor de conversas mantém a ordem em que foi entregue, por isso envie com ele os mesmos filtros.
  • --all lê todas as páginas e --max <n> para depois desse número. Encaminhado ou com --ndjson mostra um objeto JSON por linha, e com --json um único documento { items, hasMore, nextCursor }.
  • hasMore pode ser true naquela que acaba por ser a última página, e a chamada seguinte não devolve então nenhum item. Uma conversa que recebe correio novo enquanto pagina passa à frente do cursor e não é devolvida pelas páginas seguintes, e o mesmo acontece com um rascunho guardado enquanto pagina.
  • threads trash, drafts delete e labels delete pedem-lhe confirmação. Sem supervisão, com --json, --no-input ou sem terminal, param com o código de saída 2 e não alteram nada, a menos que passe --yes.
  • --dry-run mostra o pedido que um comando enviaria, com a credencial ocultada, e sai com o código 0 sem o enviar nem pedir confirmação. Com --json mostra { dryRun, request }.

Corpos JSON e limpar um campo

--data recebe o corpo inteiro como JSON, em linha, de um ficheiro com @path ou de stdin com -, e uma opção que também passe substitui a respetiva chave.

Um valor de opção vazio é um erro de utilização, por isso um campo que um valor vazio limpa passa por --data. --label-color null limpa a cor de uma etiqueta.

Terminal
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"

O primeiro guarda o rascunho sem remetente, o segundo separa-o da conversa a que respondia e o terceiro limpa os destinatários.

Todas as opções

Terminal
openemail threads --helpopenemail threads list --helpopenemail drafts create --help --json

openemail <namespace> <verb> --help mostra cada argumento e opção com o tipo, os scopes de que a chamada precisa, o método e o caminho, o que devolve e as notas da referência da API. Acrescente --json para ter a mesma ajuda como dados.

A sua caixa de entrada,
nos seus termos.

Infraestrutura de email para empresas, IA, agentes e correio pessoal. Feita para escala, privacidade e controlo. Tudo o que o email devia ter tido desde o primeiro dia.

OpenEmail

Infraestrutura de email para empresas, IA, agentes e correio pessoal. Feita para escala, privacidade e controlo. Tudo o que o email devia ter tido desde o primeiro dia.

© 2026 OpenEmail. Todos os direitos reservados.