Fils, brouillons et libellés
Chaque commande des espaces de noms threads, drafts et labels, et leur place sous inbox, read, archive et les autres commandes de courrier.
Vue d'ensemble
Les commandes de courrier, comme inbox, read, archive et label add, sont écrites pour des personnes : elles prennent plusieurs identifiants de fil à la fois, mettent en forme ce qu'elles affichent et gardent les identifiants de libellé hors de vue. Chacune exécute des commandes de cette page, qui sont les méthodes du SDK pour les fils, les brouillons et les libellés, une commande par méthode, donc threads.listAttachments devient openemail threads list-attachments.
Utilisez-les quand vous avez besoin de ce que les commandes de courrier laissent de côté : un fil exactement tel que l'API le renvoie, les fichiers d'un message, les brouillons, et la création, le renommage, le changement de couleur ou la suppression de libellés.
openemail threadetopenemail draftfonctionnent aussi bien que les noms au pluriel.openemail labelsn'a pas de forme au singulier :openemail labelest la commande de courrier qui pose des libellés sur des fils.- Les verbes acceptent les alias habituels :
lspourlist,showetviewpourget,newetaddpourcreate,editpourupdate, etrm,deletremovepourdelete. - Chaque option figure dans
openemail <namespace> <verb> --help, commeopenemail threads list --help.
Fils
Les conversations de la boîte mail. Un identifiant de fil comme CAHk7pQ2x9LmZ4 vient de threads list, openemail inbox ou openemail search.
| Commande | Ce qu'il fait |
|---|---|
| openemail threads list | Lister une page de fils d'un dossier, du plus récent au plus ancien. Chaque ligne n'est qu'un identifiant. --folder, --query, --label-ids, --sort, --date-from, --date-to et --from-contacts la filtrent et la trient |
| openemail threads get <id> | Lire un fil avec chacun de ses messages, du plus ancien au plus récent, avec ses libellés et son état non lu |
| openemail threads update <id> | Marquer un fil comme lu avec --read ou non lu avec --no-read, et poser ou retirer des libellés avec --add-label-ids et --remove-label-ids, jusqu'à 50 chacune |
| openemail threads trash <id> | Déplacer un fil vers la corbeille, hors de la boîte de réception, du spam, des fils en veille et de l'archive en une seule étape. Demande confirmation |
| openemail threads snooze <id> <wake-at> | Masquer un fil jusqu'à un instant futur, comme 2026-10-01T09:00:00Z. Le remettre en veille remplace l'heure de réveil |
| openemail threads unsnooze <id> | Ramener tout de suite un fil en veille dans la boîte de réception et effacer son heure de réveil |
| openemail threads list-attachments <id> <message-id> | Lister les pièces jointes d'un message, chacune avec ses octets en ligne en base64 dans content |
--foldervautinboxpar défaut et est comparé comme un identifiant de libellé, doncsent,archive,spam,trash,draft,snoozed,starredetunreadfonctionnent,binse lit commetrash, et un identifiant de libellé utilisateur commeUSER_RECEIPTSfonctionne aussi. Un dossier qui ne correspond à rien renvoie une page vide, pas une erreur.--queryaccepte la syntaxe de recherche de l'application, etin:anywherecherche dans tous les dossiers.--label-idsfiltre davantage, car un fil doit porter le dossier et chaque identifiant passé.--date-fromet--date-tolisent le message le plus récent de chaque fil, et les deux bornes sont incluses.threads getinclut les brouillons de réponse non envoyés parmi les messages, marquésisDraft: true, et ouvre aussi un identifiant de brouillon.threads updatea besoin de--read,--no-readou d'un libellé à ajouter ou retirer. Les retraits sont appliqués avant les ajouts. Un identifiant de libellé qui ne désigne aucun libellé est refusé aveclabel_not_foundet rien ne change sur le fil, créez donc d'abord le libellé.TRASH,SNOOZEDetDRAFTsont refusés aveclabel_not_directly_settable: utilisezthreads trashetthreads snooze.threads trashne supprime rien, et le fil reste lisible avecthreads get, mais aucune commande ne ressort un fil de la corbeille. Mettre à la corbeille un fil en veille annule aussi son réveil.threads snoozeenvoie<wake-at>tel quel, donnez-lui donc un instant ISO 8601 futur avecZou un décalage, car une heure sans l'un ni l'autre est lue dans le fuseau horaire du serveur. Un délai comme3hest refusé comme invalide.openemail snooze --until 3haccepte un délai. Les fils se réveillent lors d'un passage horaire, jusqu'à environ une heure en retard, et toujours dans la boîte de réception.threads list-attachmentsrenvoie chaque fichier entier dans une seule réponse. Prenez l'identifiant du message dans lesmessagesdethreads get.contentest une chaîne vide quand les octets stockés sont introuvables, vérifiez donc sa longueur avant de décoder.
Brouillons
Les messages non envoyés enregistrés dans la boîte mail. Un identifiant de brouillon commence par draft-.
| Commande | Ce qu'il fait |
|---|---|
| openemail drafts list | Lister une page de brouillons, du plus récemment enregistré au plus ancien. Chaque ligne n'est qu'un identifiant, et --query les recherche |
| openemail drafts get <id> | Lire les destinataires, l'objet, le corps et l'expéditeur d'un brouillon, le fil auquel il répond et les noms de ses pièces jointes |
| openemail drafts create | Enregistrer un nouveau brouillon à partir de --to, --cc, --bcc, --subject, --html, --text, --from et --thread-id, toutes facultatives |
| openemail drafts update <id> | Modifier des champs d'un brouillon enregistré. Un champ omis garde sa valeur |
| openemail drafts delete <id> | Supprimer définitivement un brouillon. Il ne passe pas par la corbeille. Demande confirmation |
drafts list --querycherche dans l'objet, l'expéditeur et le début du corps, et ne sort jamais des brouillons.older_than:30det les autres opérateurs de date lisent la date du dernier enregistrement du brouillon, etto:,cc:etbcc:ne trouvent rien sur un brouillon.- Un brouillon est stocké comme un fil portant le libellé
DRAFT, doncthreads geten ouvre un etopenemail inbox draftles liste.drafts get,updateetdeleterefusent un identifiant de fil ordinaire avec un 404. - Un simple
openemail drafts createenregistre un brouillon vide. Seules les longueurs sont vérifiées : un objet jusqu'à 998 caractères, et--htmlet--textjusqu'à 1 000 000 chacun,--htmlétant conservé quand les deux sont définis. Il n'y a pas d'option pour les pièces jointes. drafts updateremplace chaque champ que vous envoyez. Une liste remplace entièrement celle qui est stockée, donc--toavec une adresse abandonne les autres, et une mise à jour vide la liste des pièces jointes du brouillon.--thread-idenregistre le fil auquel répond un brouillon, mais le brouillon reste stocké comme un fil à part.- Relancer
drafts createenregistre un second brouillon, car la commande ne prend pas de clé d'idempotence. Un nom d'affichage contenant une virgule se scinde en deux destinataires invalides, omettez donc la virgule. openemail send --draft <id> --to <address>envoie un brouillon. Le corps vient du brouillon, tout comme l'objet sauf si vous passez--subject, tandis que les destinataires sont ceux que vous nommez. Ne peut pas être combiné avec un corps,--templateou--translate.
Libellés
Les libellés qu'un fil peut porter. Un identifiant de libellé utilisateur est USER_ suivi du nom avec lequel il a été créé, en majuscules, chaque suite d'espaces devenant _, donc Big Clients devient USER_BIG_CLIENTS.
| Commande | Ce qu'il fait |
|---|---|
| openemail labels list | Lister les libellés utilisateur de l'espace de travail, triés par nom, chacun avec sa couleur, threadCount, createdAt et updatedAt |
| openemail labels list-colors | Lister la palette que propose l'application, quatorze couleurs unies et sept dégradés. value est ce qu'il faut passer comme couleur |
| openemail labels get <id> | Lire un libellé utilisateur, son identifiant étant comparé en respectant la casse |
| openemail labels create --name <value> | Créer un libellé utilisateur. --color-background-color lui donne une couleur |
| openemail labels update <id> | Renommer un libellé ou changer sa couleur. L'identifiant reste, tout comme les fils qui le portent |
| openemail labels delete <id> | Supprimer un libellé et le retirer de chaque fil qui le portait. Demande confirmation |
- Un identifiant ne change jamais, même après un renommage, stockez donc des identifiants plutôt que des noms.
- Les libellés système comme
INBOX,STARREDetUNREADne sont pas listés et ne peuvent être ni modifiés ni supprimés, bien quethreads updateles accepte.labels getsur l'un d'eux donne un 404. - Un espace de travail contient jusqu'à 50 libellés utilisateur. Un nom qu'un autre libellé porte déjà, comparé sans tenir compte de la casse, est refusé avec
label_name_taken. - Une couleur est une valeur hexadécimale comme
#3B82F6ou un jeton de dégradé commegradient:sunset.--label-colorprend toute la couleur en JSON, et--label-color nulll'efface. - Un libellé appartient à l'espace de travail, donc le renommer, changer sa couleur ou le supprimer le change pour tout le monde dans cet espace.
labels deletene peut pas être annulé. Recréer un libellé du même nom donne le même identifiant, mais les fils ne le récupèrent pas. SonthreadCountdanslabels getindique combien de conversations vont le perdre.
Comment les commandes de courrier les utilisent
| Commande de courrier | Ce qu'elle exécute |
|---|---|
| inbox [folder] | threads list pour une page, puis threads get sur chaque fil, six à la fois |
| search <query...> | threads list --query, puis threads get sur chaque fil |
| read <thread-id> | threads get, puis threads update --read sauf si vous passez --no-mark-read |
| reply <thread-id> | threads get pour les destinataires, l'objet et l'adresse d'envoi, puis emails send dans le fil |
| 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 qui ajoute ou retire STARRED |
| mark read, unread <thread-id...> | threads update --read ou --no-read |
| trash <thread-id...> | threads trash |
| snooze <thread-id...> --until <when> | threads snooze, un délai comme 3h étant d'abord converti en instant |
| 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 |
- Une commande de courrier prend plusieurs identifiants de fil et rend compte de chacun, et avec
--jsonelle affiche{ results, succeeded, failed }. Une commande de cette page prend un identifiant et affiche ce que renvoie l'API. openemail inboxlit chaque fil qu'elle liste pour montrer qui a écrit en dernier et l'objet.threads listfait une requête par page et n'affiche que des identifiants, ce qui suffit à un pipeline.openemail readtransforme un message HTML en texte et marque le fil comme lu.threads getaffiche le fil tel que l'API le renvoie et ne change rien.
Exemples
Marquer un fil comme lu, l'archiver et lui poser un libellé en une seule requête, là où mark read, archive et label add en feraient trois :
openemail threads update CAHk7pQ2x9LmZ4 --read --add-label-ids ARCHIVE,USER_RECEIPTS --remove-label-ids INBOX --jsonCréer un libellé et y classer chaque fil correspondant. Redirigé, --all affiche un objet JSON par ligne :
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_RECEIPTSEnregistrer un fichier d'un message. Les identifiants des messages se trouvent dans les 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.pdfRédiger un brouillon, le modifier, le relire, puis l'envoyer :
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]Faire le ménage dans les brouillons que personne n'a enregistrés depuis 30 jours. La simulation affiche chaque DELETE sans l'envoyer, et --yes répond à la confirmation :
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.txtChoisir un dégradé dans la palette, prévisualiser le changement, l'appliquer, puis retirer la couleur plus tard :
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 et codes de vérification
| Scope | Commandes |
|---|---|
| threads:read | threads list, get et list-attachments |
| threads:write | threads update, trash, snooze et unsnooze |
| drafts:read | drafts list et get |
| drafts:write | drafts create, update et delete |
| labels:read | labels list, list-colors et get |
| labels:write | labels create, update et delete |
Un scope manquant s'arrête avec le code de sortie 4. Aucune de ces commandes ne demande de code de vérification, que ce soit avec une connexion par navigateur ou avec une clé API.
Une connexion ou une clé limitée à certaines adresses ne voit que les fils qui leur ont été livrés, et tout autre fil donne un 404, comme s'il n'existait pas. Les libellés appartiennent à l'espace de travail, elle voit donc toujours chaque libellé, mais threadCount ne compte que les conversations qu'elle peut voir.
Pages, confirmations et simulations
threads list,drafts listetlabels listlisent une page, de 25 éléments sauf si--limitindique autre chose, jusqu'à 100.--cursorreprend au curseur qu'une page a affiché. Un curseur de fils garde l'ordre dans lequel il a été remis, envoyez donc les mêmes filtres avec lui.--alllit chaque page et--max <n>s'arrête après autant d'éléments. Redirigé ou avec--ndjson, il affiche un objet JSON par ligne, et avec--jsonun seul document{ items, hasMore, nextCursor }.hasMorepeut valoir true sur ce qui s'avère être la dernière page, et l'appel suivant ne renvoie alors aucun élément. Un fil qui reçoit du nouveau courrier pendant que vous parcourez les pages passe devant le curseur et n'est pas renvoyé par les pages suivantes, tout comme un brouillon enregistré pendant ce temps.threads trash,drafts deleteetlabels deletedemandent confirmation. Sans surveillance, avec--json,--no-inputou sans terminal, elles s'arrêtent avec le code de sortie2et ne changent rien, sauf si vous passez--yes.--dry-runaffiche la requête qu'une commande enverrait, avec l'identifiant masqué, et sort avec le code0sans l'envoyer ni demander de confirmation. Avec--json, il affiche{ dryRun, request }.
Corps JSON et effacement d'un champ
--data prend tout le corps en JSON, en ligne, depuis un fichier avec @path ou depuis stdin avec -, et une option passée en plus remplace sa clé.
Une valeur d'option vide est une erreur d'utilisation, donc un champ qu'une valeur vide efface passe plutôt par --data. --label-color null efface la couleur d'un libellé.
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"La première enregistre le brouillon sans expéditeur, la deuxième le détache du fil auquel il répondait, et la troisième efface ses destinataires.
Chaque option
openemail threads --helpopenemail threads list --helpopenemail drafts create --help --jsonopenemail <namespace> <verb> --help montre chaque argument et option avec son type, les scopes dont l'appel a besoin, sa méthode et son chemin, ce qu'il renvoie et les notes de la référence de l'API. Ajoutez --json pour obtenir la même aide sous forme de données.