Contactos, audiências e difusões
Cada comando do livro de endereços, das audiências, das difusões e da lista de supressão, com exemplos práticos.
Como se encaixam
Quatro espaços de nomes cobrem as pessoas a quem escreve. Os contactos são o livro de endereços do espaço de trabalho, as audiências são listas de contactos com nome, uma difusão envia uma mensagem a todas as pessoas de algumas audiências, e a lista de supressão contém os endereços para os quais o espaço de trabalho não envia. Cada comando chama um método do SDK, por isso as páginas do SDK descrevem as mesmas chamadas com mais detalhe.
- Um contacto não tem id. O seu endereço é a chave que cada comando de
contactsaceita, sem espaços e em minúsculas, por isso[email protected]e[email protected]são o mesmo contacto. Uma audiência tem um idaud_, uma difusão um idbrd_, e uma supressão o id quesuppressions listmostra. - Cada contacto está na audiência predefinida enquanto existir. Essa audiência não pode ser eliminada, esvaziada nem reduzida, e nela
builtinédefault. - O livro de endereços pertence ao espaço de trabalho, por isso cada membro e cada chave leem e escrevem o mesmo.
- Cada espaço de nomes responde também ao seu singular, como em
openemail contact get, e os aliases habituais funcionam:ls,show,new,editerm. Emsuppressions, cujos verbos sãoadderemove,newleva aaddermaremove.
openemail <namespace> <verb> --help mostra cada opção com o tipo, os scopes, o endpoint e o que o comando devolve. Acrescente --json para ter a mesma página como dados.
Contactos
O livro de endereços do espaço de trabalho: as pessoas a quem um membro escreveu a partir do editor da aplicação, mais quem tiver sido guardado à mão. O correio que chega não acrescenta ninguém, e um envio pela API ou pela CLI também não.
| Comando | O que faz |
|---|---|
| openemail contacts list | Uma página dos contactos guardados, primeiro aqueles a quem se escreveu mais recentemente. --source mantém os contactos manual ou auto, e --q pesquisa nomes e endereços |
| openemail contacts get <email> | Um contacto, com todas as audiências em que está |
| openemail contacts create --email <value> | Guardar um contacto novo, com --name, --notes e --audience-ids. Um endereço que já está no livro é recusado com 409 contact_exists |
| openemail contacts update <email> | Alterar --name ou --notes, onde null limpa um deles. O endereço em si não pode mudar |
| openemail contacts delete <email> | Eliminar o contacto com as notas, a foto e as pertenças, e ocultar o endereço para que o editor não o volte a registar |
| openemail contacts set-audiences <email> --audience-ids <a,b> | Fazer com que as audiências em que o contacto está sejam exatamente esta lista. A audiência predefinida mantém-se sempre |
| openemail contacts list-people | Todas as pessoas da página Contactos: os contactos guardados e, com threads:read, cada endereço visto no correio, com o número de conversas. --sort, --q, --email e --blocked filtram-na |
| openemail contacts save <email> | Guardar um endereço, manter um registado a partir de um envio ou recuperar um eliminado. Nunca dá erro, seja qual for o estado do endereço |
| openemail contacts delete-many <emails...> | Eliminar e ocultar de 1 a 200 endereços numa só chamada |
| openemail contacts set-photo <email> <data> | Carregar a foto a partir de um ficheiro, ou de stdin com -: PNG, JPEG, WebP ou GIF até 5 MB |
| openemail contacts remove-photo <email> | Retirar a foto e eliminar a imagem guardada |
| openemail contacts block <email> | Pôr o endereço na lista de bloqueio do espaço de trabalho, para que o correio vindo dele seja recusado. A etiqueta com sinal de mais é removida |
| openemail contacts unblock <email> | Retirar cada regra da lista de bloqueio que bloqueia o endereço, incluindo uma regra para o domínio inteiro |
| openemail contacts list-threads <email> | As conversas que o endereço escreveu ou em que lhe escreveram, em todas as pastas. --q pesquisa dentro delas |
| openemail contacts activity <email> | O correio recebido do endereço e enviado para ele num período, de 90 dias a menos que --minutes indique outra coisa, com as conversas à espera de resposta e a mediana do tempo de resposta em cada sentido |
Audiências
Listas de contactos com nome, até 100 por espaço de trabalho. Um endereço tem de ser um contacto antes de entrar numa, exceto através de import-contacts, que guarda os endereços novos pelo caminho.
| Comando | O que faz |
|---|---|
| openemail audiences list | Uma página das audiências, primeiro a predefinida e as restantes da mais recente para a mais antiga, cada uma com o seu contactCount |
| openemail audiences growth | Como as audiências cresceram num período, de 30 dias a menos que --days ou --minutes indiquem outra coisa: entradas e cancelamentos de subscrição por intervalo, e totais |
| openemail audiences get <id> | Uma audiência, com um contactCount atualizado |
| openemail audiences create --name <value> | Criar uma audiência vazia, com uma --description opcional. Os nomes não são únicos |
| openemail audiences update <id> | Alterar --name ou --description. Os membros não são tocados |
| openemail audiences delete <id> | Eliminar a audiência e manter os seus contactos. A audiência predefinida não pode ser eliminada |
| openemail audiences empty <id> | Retirar todos os contactos e manter a audiência, com o id, o nome e a descrição |
| openemail audiences list-contacts <id> | Uma página dos contactos da audiência, com a data em que cada um entrou e se cancelou a subscrição. --sort, --q, --source e --statuses filtram-na |
| openemail audiences add-contact <id> --email <value> | Pôr um contacto existente na audiência. Acrescentar alguém que já lá está não altera nada |
| openemail audiences remove-contact <id> <email> | Retirar um contacto. Um contacto que não está na audiência dá 404 |
| openemail audiences add-contacts <id> --emails <a,b> | Pôr até 200 contactos existentes, e indicar em missing os endereços que não são contactos |
| openemail audiences remove-contacts <id> --emails <a,b> | Retirar até 200 contactos, e indicar os que não estavam nela |
| openemail audiences import-contacts <id> --contacts <json|@file|-> | Importar até 500 linhas { email, name }, guardando os endereços que ainda não são contactos |
Difusões
Uma mensagem para todas as pessoas de até 10 audiências, enviada como uma cópia separada para cada pessoa, com os campos de fusão preenchidos e uma ligação para cancelar a subscrição. Cada cópia é um email normal com o seu próprio id msg_, eventos e webhooks.
| Comando | O que faz |
|---|---|
| openemail broadcasts preview --audience-ids <a,b> | Contar quem uma difusão para estas audiências alcançaria, e quem ignoraria por ter cancelado a subscrição ou estar suprimido. Não envia nada |
| openemail broadcasts send --audience-ids <a,b> --from <value> | Enviar com --subject e --html ou --text, ou com um --template guardado, agora ou em --scheduled-at |
| openemail broadcasts list | Uma página de difusões, da mais recente para a mais antiga, com contagens em direto. --audience-id mantém as enviadas para essa audiência |
| openemail broadcasts get <id> | Uma difusão, com o estado e as contagens em direto: o comando a consultar enquanto é enviada |
| openemail broadcasts stats <id> | Totais de entregues, devolvidos, abertos, clicados e cancelamentos de subscrição, e uma série por intervalo de --grain, de uma hora a menos que indique outra coisa |
| openemail broadcasts list-recipients <id> | Para quem foi cada cópia e o que lhe aconteceu. --filter mantém um grupo, como bounced ou not_opened |
| openemail broadcasts get-recipient <id> <email-id> | A cópia de uma pessoa, com o assunto, o HTML e o texto exatamente como os recebeu |
| openemail broadcasts cancel <id> | Parar uma difusão agendada, em fila ou ainda a ser enviada. As cópias que já saíram não podem ser recuperadas |
Supressões
Os endereços para os quais este espaço de trabalho não envia: devoluções permanentes e queixas, registadas quando acontecem, e qualquer endereço que acrescente à mão. Um envio para um deles é recusado para esse destinatário antes de sair alguma coisa.
| Comando | O que faz |
|---|---|
| openemail suppressions list | Uma página da lista, da mais recente para a mais antiga. --reason mantém bounce, complaint ou manual, e --q pesquisa |
| openemail suppressions get <id> | Uma linha: o endereço, o motivo, o detalhe que a devolução ou a queixa trazia, e se pode ser removida |
| openemail suppressions add --email <value> | Deixar de enviar para um endereço. Acrescentar um que já lá está devolve a linha que tem |
| openemail suppressions remove <id> | Voltar a permitir correio para o endereço. Uma devolução permanente não pode ser removida |
As supressões e a lista de bloqueio são listas diferentes. suppressions add impede que saia correio para um endereço, e contacts block recusa o correio que chega dele.
Scopes
A maioria dos comandos precisa do scope de leitura ou de escrita do seu espaço de nomes. Alguns precisam de outro, porque leem ou alteram outra coisa:
| Scope | Comandos |
|---|---|
| contacts:read | contacts list, get e list-people |
| contacts:write | contacts create, update, delete, save, delete-many, set-photo e remove-photo, e audiences import-contacts a par de audiences:write |
| audiences:read | audiences list, growth, get e list-contacts, e broadcasts preview, por isso uma chave que não pode enviar consegue na mesma mostrar a contagem |
| audiences:write | Todos os outros comandos de audiences, e contacts set-audiences. contacts create --audience-ids precisa dele a par de contacts:write |
| threads:read | contacts list-threads e activity, e os endereços vistos no correio em list-people |
| settings:read | suppressions list e get |
| settings:write | suppressions add e remove, e contacts block e unblock |
| emails:read | broadcasts list, get, stats, list-recipients e get-recipient |
| emails:send | broadcasts send, que também precisa de audiences:read, e broadcasts cancel |
- Uma chave limitada a determinados endereços ou domínios lê e escreve o mesmo livro de endereços que qualquer outra chave. Só vê as difusões enviadas a partir de um endereço ou domínio que tem, recebe apenas os contactos guardados de
list-people, e é recusada com 422capability_unsupportedporcontacts list-threads,activity,blockeunblock, e porsuppressions adderemove. - Um início de sessão no navegador de um membro que só alcança alguns endereços é recusado com 422
capability_unsupportedem cada comando decontacts,audiencesebroadcasts.suppressions addrecusa um início de sessão no navegador de qualquer pessoa que não seja o proprietário do espaço de trabalho.
Exemplos práticos
Crie uma audiência a partir de um ficheiro e conte depois quem uma difusão para ela alcançaria. import-contacts guarda os endereços que ainda não são contactos, e voltar a executá-lo não cria nem acrescenta nada duas vezes.
[ { "email": "[email protected]", "name": "Ada Lovelace" }, { "email": "[email protected]", "name": "Grace Hopper" }, { "email": "[email protected]" }]AUDIENCE=$(openemail audiences create --name 'Product updates' --json | jq -r .id)openemail audiences import-contacts "$AUDIENCE" --contacts @contacts.jsonopenemail broadcasts preview --audience-ids "$AUDIENCE"Verifique uma difusão com --dry-run, que mostra o pedido e não envia nada, e depois envie-a. A difusão é criada de imediato e enviada em segundo plano, por isso consulte get para a acompanhar. Este corpo não inclui {{unsubscribeUrl}}, por isso cada cópia recebe um rodapé de uma linha para cancelar a subscrição.
{ "audienceIds": ["aud_4c1b8e2a7d9f05c36b4e8a71"], "from": "Acme <[email protected]>", "subject": "{{firstName|Hello}}, the September release is out", "html": "<p>Hi {{firstName|there}},</p><p>Here is what changed this month.</p>", "scheduledAt": "2026-10-01T09:00:00Z"}openemail broadcasts send --data @broadcast.json --dry-runBROADCAST=$(openemail broadcasts send --data @broadcast.json --yes --json | jq -r .id)openemail broadcasts get "$BROADCAST"openemail broadcasts stats "$BROADCAST" --grain dayVeja quem uma difusão não alcançou. --ndjson mostra um destinatário por linha, e --all --json um único documento com todas as páginas.
openemail broadcasts list-recipients brd_5a8c1e3f7b2d94a06c8e1f3b --filter bounced --ndjson | jq -r .emailopenemail broadcasts list-recipients brd_5a8c1e3f7b2d94a06c8e1f3b --filter not_opened --all --json | jq ".items | length"openemail suppressions list --reason bounce --all --max 50Copie os membros com subscrição de uma audiência para outra. jq transforma o fluxo no corpo que add-contacts aceita, e --data - lê-o de stdin. --max 200 limita-o aos 200 endereços que uma chamada aceita.
openemail audiences list-contacts aud_9f2c4b7e1a0d63d84c5f2e7b --statuses subscribed --max 200 --ndjson \ | jq -s '{ emails: map(.email) }' \ | openemail audiences add-contacts aud_1c4e7a9b2d0f36e85a7c1b4d --data -Elimine cada contacto que o editor registou num domínio. delete-many aceita até 200 endereços por chamada, por isso xargs -n 200 divide uma lista mais longa. Verifique primeiro os lotes com --dry-run, porque não é possível anular.
openemail contacts list --source auto --all --ndjson \ | jq -r 'select(.email | endswith("@old-vendor.example")) | .email' > leaving.txtxargs -n 200 openemail contacts delete-many --dry-run < leaving.txtxargs -n 200 openemail contacts delete-many --yes < leaving.txtDeixe de enviar para um endereço, volte a permitir outro e bloqueie um remetente. removable diz que linhas suppressions remove aceita.
openemail suppressions add --email [email protected]openemail suppressions list --q [email protected] --json | jq -r '.items[] | select(.removable) | .id'openemail suppressions remove 7b1e2c3d-4f5a-4b6c-8d7e-9f0a1b2c3d4e --yesopenemail contacts block [email protected]Confirmações e códigos de verificação
Estes comandos pedem-lhe confirmação num terminal antes de serem executados:
| Espaço de nomes | Pede confirmação |
|---|---|
| contacts | delete, delete-many, remove-photo e unblock |
| audiences | delete, empty, remove-contact e remove-contacts |
| broadcasts | send e cancel |
| suppressions | remove |
--yesconfirma por si. Sem supervisão, com--jsonou--no-input, em CI ou sem terminal, um comando que perguntaria para comRefusing to run unattended. Pass --yes to confirm.e o código de saída2.--dry-runmostra o pedido que o comando enviaria e sai com o código0, sem perguntar e sem alterar nada.- Com um início de sessão no navegador,
audiences deletepede primeiro um código de verificação, como faz a aplicação web.--yesnunca o salta, e sem supervisão o comando para com o código de saída4. Execute antesopenemail verify, ou use uma chave de API, à qual nunca é pedido. audiences emptynunca pede um código de verificação, por isso verifique o id antes de passar--yes.
Paginação
Cada comando que lista lê uma página. Quando restam mais, passe a --cursor o cursor que mostrou, com os mesmos filtros, ou leia-as todas:
--alllê todas as páginas e transmite os itens: uma tabela num terminal, e um objeto JSON por linha quando encaminhado ou com--ndjson.--max <n>para depois desse número de itens, e implica--all.--jsonmostra um único documento{ items, hasMore, nextCursor }, também com--all.- Um cursor mal formado ou expirado dá 400
invalid_cursor. Comece de novo sem ele.
| Comando | Tamanho da página |
|---|---|
| openemail contacts list | De 1 a 200, 50 a menos que --limit indique outra coisa |
| openemail contacts list-people | De 1 a 100, 25 a menos que --limit indique outra coisa |
| openemail contacts list-threads | De 1 a 100, 25 a menos que --limit indique outra coisa |
| openemail audiences list | De 1 a 100, 25 a menos que --limit indique outra coisa |
| openemail audiences list-contacts | De 1 a 200, 50 a menos que --limit indique outra coisa |
| openemail broadcasts list | De 1 a 100, 25 a menos que --limit indique outra coisa |
| openemail broadcasts list-recipients | De 1 a 200, 50 a menos que --limit indique outra coisa |
| openemail suppressions list | De 1 a 100, 25 a menos que --limit indique outra coisa |
É bom saber
contacts createrecusa um endereço que já está no livro com 409contact_exists, por isso uma nova tentativa nunca substitui um nome que alguém editou.contacts savenunca recusa: guarda, mantém ou recupera o endereço, seja qual for o estado.contacts deleteaceita também um endereço que só foi visto no correio, o que retira essa pessoa delist-people. O correio fica. Não é possível anular: guardar de novo o endereço começa um contacto sem nome, sem notas e sem outra audiência além da predefinida.- O endereço é a identidade de um contacto, por isso
contacts updatenão o pode alterar. Mover um contacto é umdeletee umcreate. contacts set-photolê a imagem de um ficheiro, ou de stdin com-. Passe--content-type, comoimage/jpeg: sem ele a imagem pode ir comoapplication/octet-stream, que o servidor recusa com 422invalid_image.broadcasts send --scheduled-ataceita uma hora ISO 8601 como2026-10-01T09:00:00Z, ou uma duração ISO 8601 comoPT2HouP1D, até 365 dias no futuro. Os atrasos curtos quesend --ataceita, como2h, são aqui recusados.- Os campos de fusão funcionam em
--subject,--htmle--text:{{firstName}},{{lastName}},{{name}},{{email}}e{{unsubscribeUrl}}, cada um com um valor alternativo depois de uma barra, como em{{firstName|there}}. Um corpo que não inclui{{unsubscribeUrl}}recebe um rodapé de uma linha para cancelar a subscrição. Um modelo é enviado tal como está, por isso ponha a ligação no modelo. - Uma difusão é verificada contra os envios mensais do plano antes de se escrever o que quer que seja, e cada cópia conta como um envio. Uma que a quota não consegue cobrir é recusada com 429
send_quota_exceeded, e nada fica para trás. - Passe a sua própria
--idempotency-keyabroadcasts sendquando um script puder executar o passo de novo. A mesma chave responde com a difusão que criou em vez de enviar uma nova. - Um contacto que cancela a subscrição de uma difusão continua na audiência com
unsubscribedAtdefinido, e as difusões seguintes para essa audiência ignoram-no.audiences list-contacts --statuses unsubscribedlista-os. - Uma devolução permanente fica na lista de supressão.
suppressions removerecusa-a com 409suppression_not_removable, eremovableem cada linha indica-o de antemão.