Authentification
Connectez-vous avec votre navigateur ou une clé API, gardez plusieurs profils et vérifiez un code avant un changement sensible.
Deux façons de se connecter
Lancez openemail login dans un terminal et elle vous demande laquelle vous voulez. Dans les deux cas, la connexion est enregistrée comme profil, et chaque commande suivante utilise le profil actif.
| Commande | Agit en tant que | Codes de vérification |
|---|---|---|
| openemail login | Vous, dans l'espace de travail et avec l'accès que vous approuvez | Demandé avant quelques changements sensibles |
| openemail login --with-token | L'espace de travail, avec les scopes de la clé | Jamais demandé |
- Seule une connexion par navigateur peut utiliser
ai compose,ai summarizeet les commandes MCP. - Une connexion par navigateur dure jusqu'à l'expiration de l'approbation choisie, ou jusqu'à votre déconnexion. Une clé fonctionne jusqu'à sa révocation.
Connexion par navigateur
openemail loginenregistre une nouvelle application pour cette connexion, nomméeOpenEmail CLI on <your computer>, et ouvre la page d'approbation d'OpenEmail dans votre navigateur. Si le navigateur ne s'ouvre pas, utilisez le lien qu'elle affiche.- Connectez-vous si besoin, puis choisissez l'espace de travail, l'accès de la CLI (lecture, lecture et envoi, complet, ou votre propre ensemble de permissions), les domaines ou adresses qu'elle atteint, et la durée de l'approbation.
- Approuvez. Le navigateur renvoie l'approbation au terminal de lui-même, et vous pouvez fermer l'onglet. La CLI affiche sous quelle identité vous êtes connecté, l'espace de travail et la date d'expiration de l'approbation.
openemail loginopenemail login --scopes emails:send,threads:readopenemail login --profile work- La CLI attend votre approbation pendant 10 minutes. Choisir Pas maintenant sur la page d'approbation annule la connexion, avec le code de sortie
10. --scopesprésélectionne des permissions sur la page d'approbation, et vous pouvez encore les modifier là.- Quand le profil contient déjà une connexion, un terminal demande avant de la remplacer. Sans surveillance, il refuse, sauf si vous passez
--forceou--yes. Remplacer une connexion par navigateur révoque l'ancienne.
Chaque connexion par navigateur est une application connectée à part entière, listée dans Compte → Applications connectées avec l'accès approuvé, où vous pouvez le modifier ou la supprimer. openemail open apps ouvre cette page.
Dessous se trouve le flux OAuth qu'utilise le serveur MCP : un client public avec PKCE, un code à usage unique et un jeton d'accès valable une heure et renouvelé pour vous. Le navigateur revient vers 127.0.0.1 sur un port aléatoire, et seul le code de cette connexion y est accepté.
Par SSH, ou sans navigateur
Quand la CLI ne peut pas ouvrir de navigateur sur cette machine, elle affiche le lien à la place : par SSH, en CI, sous Linux sans affichage, ou quand vous passez --no-browser. Ouvrez le lien dans un navigateur sur n'importe quel appareil et approuvez. La page affiche alors un code de connexion, que vous collez dans le terminal.
$ openemail login --no-browserOpen this link in a browser on any device to sign in: https://api.openemail.uk/auth/mcp/authorize?response_type=code&client_id=…Paste the code from your browser- Un code ne vaut que pour la connexion qui a affiché le lien, donc un code venu d'un autre onglet est refusé.
- Coller l'adresse complète où le navigateur a abouti fonctionne aussi.
- Sans terminal, envoyez le code sur stdin.
Clés API
Une clé API connecte un script sans navigateur et ne se voit jamais demander de code. Créez-en une dans Paramètres → Clés API (openemail open api-keys) avec seulement les scopes dont le script a besoin. La CLI vérifie la clé avec GET /keys/self avant de l'enregistrer, et accepte les clés oe_live_ et oe_test_. Le courrier envoyé avec une clé de test n'est jamais distribué.
openemail login --with-token < ~/.config/openemail/keyecho "$OPENEMAIL_KEY" | openemail login --with-token --profile ciopenemail login --token oe_live_…--token fonctionne aussi, mais la clé atterrit dans l'historique de votre shell, donc la CLI vous avertit et suggère --with-token. Deux façons utilisent une clé sans l'enregistrer :
OPENEMAIL_API_KEYdans l'environnement est utilisée par chaque commande qui la voit, avant tout profil enregistré.--api-key <key>est utilisée pour cette seule commande.
Quand il y a plus d'un identifiant, le premier de ceux-ci l'emporte : --api-key, OPENEMAIL_API_KEY, le profil nommé par --profile, le profil nommé par OPENEMAIL_PROFILE, puis le profil actif.
Profils
Un profil est une connexion enregistrée, de l'un ou l'autre type. Le premier s'appelle default. Connectez-en d'autres avec --profile, et passez de l'un à l'autre :
openemail login --profile workopenemail profile listopenemail profile use workopenemail inbox --profile defaultOPENEMAIL_PROFILE=work openemail statusopenemail profile currentopenemail profile remove workprofile listmontre chaque profil avec son type, son espace de travail et son utilisateur ou sa clé, et marque le profil actif. Son JSON n'inclut jamais de jeton ni de clé.profile currentn'affiche que le nom sur stdout, donc$(openemail profile current)fonctionne dans un script.profile remove <name>équivaut àopenemail logout --profile <name>.- Un nom de profil compte jusqu'à 64 lettres, chiffres, points, tirets et tirets bas.
profile uses'appelle aussiprofile switch. Retirer le profil actif, ou s'en déconnecter, ne laisse aucun profil actif, et la commande suivante qui a besoin d'une connexion renvoie versopenemail profile use <name>.
À quelle API parle une connexion
Un profil enregistré retient l'API à laquelle il s'est connecté, et son identifiant n'est jamais envoyé ailleurs. Un --base-url ou OPENEMAIL_BASE_URL qui nomme une autre origine arrête la commande avec le code de sortie 2 avant tout envoi, et explique comment se connecter à cette origine avec un profil à part.
openemail login --profile other --base-url https://api.example.comopenemail inbox --profile other- Une clé venant de
OPENEMAIL_API_KEYou de--api-keyn'est pas un profil enregistré : elle va donc vers l'origine de--base-urlou deOPENEMAIL_BASE_URL, ou vershttps://api.openemail.ukquand aucun des deux n'est défini. - Les commandes qui n'envoient aucun identifiant suivent
--base-urletOPENEMAIL_BASE_URLquel que soit le profil actif : les boîtes jetables, les méthodes qui n'ont pas besoin de clé,docsetopen. - Le
httpsimple est refusé pour toute origine sauflocalhost,127.0.0.1et::1, avec le code de sortie2: l'API, l'application web, les requêtes de connexion, de jeton et de révocation, et le serveur MCP. Utilisezhttpspour tout le reste. - Un chemin de requête qui sortirait de l'origine de l'API, comme
openemail api //example.com/x, s'arrête avec le code de sortie2etinvalid_pathavant tout envoi.
Ce que chaque connexion ne peut pas faire
Une connexion par navigateur agit en votre nom, mais certaines choses ne sont jamais approuvées pour une application, quel que soit l'accès choisi :
- Gérer les clés API.
keys:writeetkeys:managene sont jamais accordés, donc créer, faire tourner et révoquer des clés exige une clé API qui détientkeys:manage, ou l'application web.openemail me rotatefait tourner la clé avec laquelle vous appelez, il lui faut donc une clé API. - La facturation, et les espaces de travail eux-mêmes. Les forfaits, les factures, ainsi que créer, changer ou supprimer un espace de travail restent dans l'application web.
- Votre adresse gratuite. Une application est approuvée pour un espace de travail professionnel, et l'espace personnel qui contient l'adresse gratuite n'est jamais proposé, selon la même règle que l'API.
- Les membres et les rôles, sauf si l'approbation couvre tout l'espace de travail.
members:writeetroles:writesont retirés d'une approbation limitée à certains domaines ou adresses.
Une clé API a sa propre limite. ai compose, ai summarize et chaque commande openemail mcp sauf config passent par le serveur MCP, qui exige une connexion par navigateur, donc avec une clé elles s'arrêtent avec le code de sortie 4 et disent pourquoi.
Codes de vérification
Avec une connexion par navigateur, quelques changements demandent d'abord un code de vérification, comme dans l'application web. La CLI le demande quand elle en a besoin : elle vous envoie par e-mail un code à six chiffres ou, si la connexion à deux facteurs est activée, demande un code de votre application d'authentification ou l'un de vos codes de secours. Une fois le code correct, la commande s'exécute, et cette connexion n'est plus sollicitée pendant 60 minutes. On ne demande jamais de code à une clé API.
| Commande | Demande un code |
|---|---|
| webhooks create, update | Toujours |
| rules create, update | Toujours |
| roles update, delete | Toujours |
| members add, update, remove | Toujours |
| members grant-address, revoke-address | Toujours |
| domains delete, delete-address | Toujours |
| audiences delete | Pour une audience que vous avez créée |
| audiences empty | Pour une audience que vous avez créée et qui contient encore des contacts |
| mcp call createRule, setRuleEnabled | Toujours |
| mcp call removeDomain, removeDomainAddress | Toujours |
| mcp call deleteAudience, emptyAudience | Comme la commande d'audience correspondante |
| api | Quand l'opération qu'elle appelle est l'une des précédentes |
$ openemail webhooks create --url https://acme.com/hooks/openemailWe emailed a code to a•••@acme.com.Verification code: 482913Verified. You will not be asked again for 60 minutes.- Tapez
rà l'invite pour recevoir l'e-mail à nouveau. Un code erroné indique combien d'essais il reste. - Une fois le code accepté, la commande s'exécute une fois de plus, jamais deux.
--yesconfirme une suppression, mais ne saute jamais un code.- Sans surveillance (avec
--jsonou--no-input, en CI ou sans terminal), personne ne peut taper le code, donc la commande s'arrête avec le code de sortie4et ne change rien. - Un code permet 5 essais, et après le cinquième code erroné la CLI en propose un nouveau. Chaque connexion peut demander 5 codes par heure et 20 par jour.
- Dix codes erronés pour une même connexion en 24 heures mettent sa vérification en pause. La CLI indique alors quand elle reprend et s'arrête avec le code de sortie
4etstep_up_paused, sans proposer d'autre code, et l'e-mail qui l'explique nomme l'application.
Lancez openemail verify avant qu'un script ou un client IA ne fasse quelque chose de sensible. Elle demande le code maintenant, et pendant les 60 minutes suivantes chaque commande de ce profil s'exécute sans code, y compris openemail mcp call et le pont MCP local.
openemail verifyopenemail verify --statusopenemail verify --status --jsonopenemail verify --forceLes 60 minutes appartiennent à une seule connexion. Un autre profil, ou un client IA qui s'est connecté de son côté, se voit demander son propre code, et la déconnexion y met fin aussitôt. --force demande un nouveau code et démarre 60 nouvelles minutes.
Expiration, déconnexion et révocation
- Le jeton d'accès d'une connexion par navigateur vaut une heure. La CLI le renouvelle avant son expiration et enregistre le nouveau, sans que vous le remarquiez.
- Chaque jeton de rafraîchissement ne sert qu'une fois. Un ancien jeton utilisé plus de 30 secondes après que la CLI l'a remplacé, par exemple depuis une copie de
config.jsonsur une autre machine, amène le serveur à révoquer entièrement cette connexion : connectez-vous donc sur chaque machine plutôt que de copier le fichier. - L'approbation dure autant que vous l'avez choisi sur la page d'approbation. Quand elle prend fin, ou quand l'application est supprimée dans Compte → Applications connectées, la CLI ne peut plus agir pour vous et vous demande de relancer
openemail login. openemail logoutrévoque une connexion par navigateur sur le serveur, ce qui la retire des applications connectées, puis l'oublie sur cet appareil, même quand le serveur est injoignable.--alldéconnecte chaque profil.- Se déconnecter d'une clé API ne fait que l'oublier ici. La clé continue de fonctionner jusqu'à ce que vous la révoquiez, avec
openemail keys revoke <id>ou dans l'application web.
Où les connexions sont conservées
Tout se trouve dans ~/.openemail, ou dans le dossier que nomme OPENEMAIL_CONFIG_DIR. Le dossier n'est lisible que par vous (0700), tout comme chaque fichier qu'il contient (0600). Chaque fichier est écrit dans un fichier temporaire puis renommé à sa place, pour qu'un plantage ne laisse jamais un fichier à moitié écrit, et chaque changement se fait sous un fichier de verrou, pour que des commandes lancées côte à côte ne perdent jamais un profil.
| Fichier | Ce qu'il contient |
|---|---|
| config.json | Vos profils : clés API, jetons d'accès et d'actualisation, et le profil actif |
| temp-mail.json | Les boîtes jetables créées par cette CLI, avec leurs jetons de boîte |
| update-check.json | Quand npm a été interrogé pour la dernière fois sur une nouvelle version, et sa réponse |
Les jetons et les clés sont stockés en clair dans des fichiers que seul votre utilisateur peut lire, traitez donc le dossier comme une clé SSH. Un fichier que la CLI ne sait pas lire n'est jamais pris en silence pour une déconnexion : elle avertit une fois avec le chemin, et garde une copie à côté (config.json.bak) avant d'en écrire un nouveau. Un fichier qu'elle ne peut pas lire du tout, par exemple à cause de ses permissions, arrête la commande avec une erreur qui le nomme.