Listar e obter
`emails.list`, `emails.list_all`, `emails.iterate`, `emails.get` e `emails.list_events`.
emails.list
filters = {status: ["queued", "scheduled"], from: "[email protected]"} first = client.emails.list(**filters, limit: 50)second = client.emails.list(**filters, limit: 50, cursor: first.next_cursor) if first.next_cursor p first.items.size, second&.items&.sizeUma página é uma OpenEmail::Page com items, has_more? e next_cursor. Passe next_cursor de volta como cursor:, com os mesmos filtros, para obter a página seguinte.
emails.iterate e emails.list_all
client.emails.iterate(status: "failed") do |email| warn "#{email[:id]} #{email[:lastError]}"end failures = client.emails.list_all(status: "failed", from: "[email protected]")puts failures.sizeAmbos seguem next_cursor por si. iterate só obtém uma página quando o percurso lá chega, pelo que break no bloco, ou first ou find sobre o Enumerator que devolve sem bloco, interrompem os pedidos, enquanto list_all percorre todas as páginas antes de devolver um único Array, por isso dê-lhe um filtro que termine. Em ambos os casos a paginação é por keyset, pelo que uma mensagem que chegue a meio da iteração não pode fazer saltar uma linha como aconteceria com um offset.
emails.get e emails.list_events
email = client.emails.get("msg_3f9a1c07d2b84e6a9c5b1f20")puts email[:status]p email[:recipients] events = client.emails.list_all_events("msg_3f9a1c07d2b84e6a9c5b1f20")events.each { |event| puts "#{event[:type]} #{event[:createdAt]}" }get é a única chamada que devolve recipients, um Hash por endereço com os seus próprios status, error e deliveredAt. Uma lista de cinquenta mensagens, cada uma com os seus destinatários, seria uma página de relatório que ninguém pediu.
list_events lê o histórico de eventos de um envio, do mais antigo para o mais recente: email.accepted, email.queued, email.sent, email.delivered, email.bounced, email.opened e os restantes, cada um com um Hash data cuja forma depende do seu type. list_all_events e iterate_events percorrem todo o histórico por si. Os webhooks entregam um subconjunto desses mesmos eventos à medida que acontecem, por isso é aqui que deve procurar quando falhou um webhook.
Parâmetros
statusString or Array<String>- Um estado ou vários (`queued`, `scheduled`, `sending`, `sent`, `partial`, `bounced`, `cancelled`, `failed`), correspondendo a qualquer um dos indicados. `bounced` significa que todos os destinatários a quem a mensagem foi enviada a devolveram, enquanto uma mensagem devolvida por alguns e que chegou aos restantes aparece como `partial`. A gem envia um Array como um único valor separado por vírgulas porque o servidor divide pelas vírgulas, e um valor fora desse conjunto dá 422 com o valor desconhecido indicado.
broadcast_idString- Só as cópias de uma difusão, um id `brd_` vindo de `broadcasts.send`. Cada pessoa que uma difusão alcança recebe uma mensagem própria, por isso isto lista para quem foi e o que aconteceu a cada cópia. `broadcasts.list_recipients` lista as mesmas pessoas com as suas aberturas, cliques e cancelamentos de subscrição.
fromString- Correspondência exata com o endereço de envio tal como foi registado, que é o `addr@host` simples em minúsculas. A linha é escrita sem qualquer nome de apresentação, pelo que um angle-addr como `Acme <[email protected]>` não corresponde a nada. O seu valor é convertido para minúsculas antes da comparação, e é uma igualdade e não uma correspondência por prefixo ou por domínio.
scheduled_fromTime, DateTime or String- Apenas as mensagens agendadas para este instante ou depois. Com `scheduled_to:` e `status: ["scheduled", "queued"]` lista o que está à espera de sair numa janela de tempo, como faz o calendário da aplicação. Uma mensagem sem `scheduledAt` fica de fora. Passe um Time, um DateTime ou um instante ISO 8601 com o seu fuso: uma Date do Ruby é enviada como data simples, que estes dois filtros recusam.
scheduled_toTime, DateTime or String- Apenas as mensagens agendadas para este instante ou antes. Um `scheduled_from:` posterior a `scheduled_to:` dá 422 `invalid_parameter`.
limitInteger- Linhas nesta página, de 1 a 100, com 25 por predefinição. Um valor fora desse intervalo é recusado com 422 em vez de ser ajustado ao limite. Em `list_all` e `iterate` é o tamanho de cada página que obtêm.
cursorString- Um id de mensagem (`msg_…`) a partir do qual paginar. Keyset em vez de offset: as linhas devolvidas são estritamente mais antigas do que o `createdAt` dessa mensagem, pelo que envios que cheguem a meio da página não podem fazer-lhe perder uma linha. Um id que não corresponda a nenhuma mensagem neste espaço de trabalho dá 400 `invalid_cursor`.
api_keyString- Lista com esta chave em vez da do cliente.
Uma chave restringida a alguns endereços só lê as mensagens enviadas a partir dos endereços que cobre, e a página é cortada depois desse filtro, por isso todas as páginas exceto a última continuam a ter limit linhas. Um from: que a chave não cobre devolve uma última página vazia em vez de um 403.
Resposta: OpenEmail::Page
itemsArray<Hash>- Uma página de mensagens, das mais recentes para as mais antigas por `createdAt`, extraída do envelope `data` da API. As linhas da lista nunca incluem a discriminação `recipients` por endereço. Essa está em `get`.
has_more?Boolean- Indica se há mais linhas que correspondem ao filtro para além desta página. Determinado obtendo uma linha a mais do que `limit`, em vez de uma segunda consulta de contagem.
next_cursorString or nil- O id a passar de volta como `cursor:`, e nil na última página. `iterate` e `list_all` param quando este é nil ou `has_more?` é false, já que uma página que indicasse haver mais sem nomear nenhum cursor ficaria em ciclo infinito.
Cada item
objectString- Sempre `email` numa linha desta lista.
idString- O id próprio desta API, `msg_…`. É o que todas as outras chamadas de emails recebem e o que um cursor refere.
statusString- Em que fase da sua vida está a mensagem. `partial` é um estado próprio e não uma variante de falha: alguns destinatários já a têm e não é possível anular o envio, pelo que tentar de novo é errado. `bounced` significa que foi devolvida por todos os destinatários depois de sair, pelo que ninguém a tem, e cada destinatário em `get` diz porquê.
modeString- `live` ou `test`, retirado da chave que a enviou. Um envio de teste é registado aqui e nunca é transmitido.
fromString- O endereço com que o envio foi autorizado, guardado simples e em minúsculas, pelo que um nome de apresentação indicado em `from` continua a ser enviado mas não é guardado aqui. Uma String simples e não um Hash, porque esta é a identidade que foi autorizada: um endereço fora do âmbito de envio de uma chave, que não esteja num domínio que ela detém nem nomeado nela, é recusado com 403, e nunca é trocado silenciosamente por um que esteja.
subjectString or nil- O assunto tal como foi guardado. É nil numa mensagem registada sem assunto.
messageIdString or nil- O Message-ID do RFC 5322, e não o nosso id. É nil até o MIME existir, e é reescrito pelo serviço de envio à saída, pelo que uma devolução ou DSN posterior traz um id diferente e a correlação faz-se por `id`.
threadIdString or nil- A conversa a que esta mensagem pertence, quando foi indicada ou atribuída. Caso contrário, nil.
transportString or nil- Como os bytes saíram. É nil até ao despacho. Os registos guardados ainda podem nomear transportes que já não são usados, por isso trate um valor que não conheça como informação e não como um erro.
attemptsInteger- Quantas tentativas de despacho a mensagem teve, 0 antes da primeira.
lastErrorString or nil- O erro de despacho mais recente, escrito para uma pessoa. É nil enquanto nada tiver falhado.
scheduledAtString or nil- Quando a mensagem deve sair, como instante ISO 8601. É nil apenas num envio imediato sem janela de cancelamento: uma janela é um pequeno atraso e nada mais, pelo que `cancellableForSeconds` também preenche este campo, numa linha cujo `status` é `queued` e não `scheduled`.
cancellableUntilString or nil- O instante em que a mensagem deve sair, com o mesmo valor que `scheduledAt` em qualquer envio diferido e nil num que não o foi. É uma marca temporal para mostrar e não o critério que o servidor usa: `cancel` decide com base em `status`, e só interrompe uma mensagem enquanto ainda está `queued` ou `scheduled`.
sentAtString or nil- Quando saiu. É nil até o despacho estar concluído, e é por isso que `status`, e não este, é o campo em que basear a lógica.
tagsHash- As etiquetas indicadas no envio, devolvidas tal como vieram e nunca interpretadas. Sempre um Hash, vazio quando não foram definidas e nunca nil, e só devolvidas: esta lista filtra por `status`, `from`, `broadcast_id` e pela janela de agendamento, por isso uma etiqueta é algo que se lê numa mensagem, não uma forma de a encontrar.
broadcastIdString or nil- A difusão `brd_` de que esta mensagem é uma cópia, ou nil para uma mensagem enviada sozinha.
sourceString- Que superfície pediu o envio: `composer`, `api`, `mcp`, `ai` ou `queue`. `api` é este cliente.
createdAtString- Quando o registo de envio foi escrito, o que acontece antes do despacho. É o campo pelo qual a lista é ordenada e o campo com que um cursor é comparado.
trackingHash- O resumo de envolvimento, presente apenas numa linha cuja mensagem foi rastreada e ausente nos restantes casos. A ausência é a resposta a «isto foi rastreado?», enquanto um `openCount` de 0 se leria como «ninguém a abriu».
translationHash- Nunca está presente numa linha de lista: o registo da tradução está no pedido guardado, que uma lista deliberadamente não obtém. A sua ausência aqui não diz nada sobre se a mensagem foi traduzida. Consulte `get`.
O rastreio de um item
opensBoolean- Indica se esta mensagem saiu com um píxel. O que foi aplicado a esta mensagem, e não o que a definição da conta diz agora.
clicksBoolean- Indica se as ligações desta mensagem foram reescritas. É false quando o corpo não tinha ligações a reescrever, já que nesse caso nada foi alterado.
openedBoolean- Indica se foi registada alguma abertura contabilizada, derivado de `openCount` ser superior a 0.
clickedBoolean- Indica se foi registado algum clique contabilizado, derivado de `clickCount` ser superior a 0.
openCountInteger- Aberturas que se considera terem sido feitas por uma pessoa, somadas em todas as cópias da mensagem. Scanners e proxies de privacidade são registados mas excluídos, e pedidos repetidos num intervalo de trinta segundos contam como um só.
clickCountInteger- Cliques contabilizados, somados em todas as cópias. Os duplicados são eliminados por ligação e não por mensagem, porque seguir duas ligações com segundos de diferença são dois atos e não uma repetição.
firstOpenAtString or nil- A primeira abertura contabilizada entre todas as cópias, e nil enquanto não houver nenhuma. Os acessos automáticos nunca a alteram.