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 threadeopenemail draftfuncionam tal como os nomes no plural.openemail labelsnão tem forma no singular:openemail labelé o comando de correio que põe etiquetas nas conversas.- Os verbos aceitam os aliases habituais:
lsparalist,showeviewparaget,neweaddparacreate,editparaupdate, erm,deleremoveparadelete. - Cada opção está em
openemail <namespace> <verb> --help, comoopenemail 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.
| Comando | O que faz |
|---|---|
| openemail threads list | Listar 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éinboxpor predefinição e é comparado como um id de etiqueta, por isso funcionamsent,archive,spam,trash,draft,snoozed,starredeunread,biné lido comotrash, e um id de etiqueta de utilizador comoUSER_RECEIPTStambém funciona. Uma pasta que não corresponde a nada devolve uma página vazia, não um erro.--queryaceita a sintaxe de pesquisa da aplicação, ein:anywherepesquisa em todas as pastas.--label-idsfiltra ainda mais, já que uma conversa tem de ter a pasta e cada id que passar.--date-frome--date-toleem a mensagem mais recente de cada conversa, e ambos os extremos são incluídos.threads getinclui entre as mensagens as respostas em rascunho por enviar, marcadas comisDraft: true, e também abre um id de rascunho.threads updateprecisa de--read,--no-readou 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 comlabel_not_founde nada muda na conversa, por isso crie primeiro a etiqueta.TRASH,SNOOZEDeDRAFTsão recusados comlabel_not_directly_settable: usethreads trashethreads snooze.threads trashnão elimina nada, e a conversa continua legível comthreads get, mas nenhum comando tira uma conversa do Lixo. Mover para o Lixo uma conversa adiada cancela também a sua reativação.threads snoozeenvia<wake-at>tal como está, por isso indique um instante ISO 8601 futuro comZou um desvio, porque uma hora sem nenhum dos dois é lida no fuso horário do servidor. Um atraso como3hé recusado por ser inválido.openemail snooze --until 3haceita 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-attachmentsdevolve cada ficheiro inteiro numa só resposta. Tire o id da mensagem dosmessagesdethreads 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-.
| Comando | O que faz |
|---|---|
| openemail drafts list | Listar 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 create | Guardar 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 --querypesquisa no assunto, no remetente e no início do corpo, e nunca sai dos rascunhos.older_than:30de os outros operadores de data leem quando o rascunho foi guardado pela última vez, eto:,cc:ebcc:não correspondem a nada num rascunho.- Um rascunho é guardado como uma conversa com a etiqueta
DRAFT, por issothreads getabre um eopenemail inbox draftlista-os.drafts get,updateedeleterecusam um id de conversa normal com um 404. - Um
openemail drafts createsem mais nada guarda um rascunho em branco. Só os comprimentos são verificados: um assunto até 998 caracteres, e--htmle--textaté 1,000,000 cada um, e--htmlé mantido quando os dois estão definidos. Não há opção para anexos. drafts updatesubstitui cada campo que enviar. Uma lista substitui por inteiro a guardada, por isso--tocom um só endereço retira os outros, e uma atualização esvazia a lista de anexos do rascunho.--thread-idregista a conversa a que um rascunho responde, mas o rascunho continua a ser guardado como uma conversa própria.- Voltar a executar
drafts createguarda 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,--templateou--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.
| Comando | O que faz |
|---|---|
| openemail labels list | Listar as etiquetas de utilizador do espaço de trabalho, ordenadas por nome, cada uma com a cor, threadCount, createdAt e updatedAt |
| openemail labels list-colors | Listar 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,STARREDeUNREADnão são listadas e não podem ser alteradas nem eliminadas, emborathreads updateas aceite.labels getnuma 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
#3B82F6ou um token de gradiente comogradient:sunset.--label-coloraceita a cor inteira como JSON, e--label-color nulllimpa-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 deletenã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 seuthreadCountemlabels getdiz quantas conversas a vão perder.
Como os comandos de correio os usam
| Comando de correio | O 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
--jsonmostra{ results, succeeded, failed }. Um comando desta página aceita um só id e mostra o que a API devolve. openemail inboxlê cada conversa que lista para mostrar quem escreveu por último e o assunto.threads listfaz um pedido por página e mostra só ids, que é tudo o que um pipeline precisa.openemail readtransforma uma mensagem HTML em texto e marca a conversa como lida.threads getmostra 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:
openemail threads update CAHk7pQ2x9LmZ4 --read --add-label-ids ARCHIVE,USER_RECEIPTS --remove-label-ids INBOX --jsonCrie uma etiqueta e arquive nela cada conversa correspondente. Encaminhado, --all mostra um objeto JSON por linha:
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_RECEIPTSGuarde um ficheiro de uma mensagem. Os ids das mensagens estão nos messages de 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.pdfEscreva um rascunho, altere-o, leia-o de novo e depois envie-o:
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:
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.txtEscolha um gradiente da paleta, pré-visualize a alteração, faça-a e, mais tarde, retire de novo a cor:
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 e códigos de verificação
| Scope | Comandos |
|---|---|
| threads:read | threads list, get e list-attachments |
| threads:write | threads update, trash, snooze e unsnooze |
| drafts:read | drafts list e get |
| drafts:write | drafts create, update e delete |
| labels:read | labels list, list-colors e get |
| labels:write | labels 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 listelabels listleem uma página, de 25 a menos que--limitindique outra coisa, até 100.--cursorcontinua 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.--alllê todas as páginas e--max <n>para depois desse número. Encaminhado ou com--ndjsonmostra um objeto JSON por linha, e com--jsonum único documento{ items, hasMore, nextCursor }.hasMorepode 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 deleteelabels deletepedem-lhe confirmação. Sem supervisão, com--json,--no-inputou sem terminal, param com o código de saída2e não alteram nada, a menos que passe--yes.--dry-runmostra o pedido que um comando enviaria, com a credencial ocultada, e sai com o código0sem o enviar nem pedir confirmação. Com--jsonmostra{ 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.
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
openemail threads --helpopenemail threads list --helpopenemail drafts create --help --jsonopenemail <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.