Autenticación
Inicia sesión con tu navegador o una clave de API, mantén varios perfiles y verifica un código antes de un cambio delicado.
Dos formas de iniciar sesión
Ejecuta openemail login en un terminal y te pregunta cuál quieres. En ambos casos el inicio de sesión se guarda como perfil, y cada comando posterior usa el activo.
| Comando | Actúa como | Códigos de verificación |
|---|---|---|
| openemail login | Tú, en el espacio de trabajo y con el acceso que apruebes | Se pide antes de algunos cambios delicados |
| openemail login --with-token | El espacio de trabajo, con los scopes que tiene la clave | Nunca se pide |
- Solo un inicio de sesión con el navegador puede usar
ai compose,ai summarizey los comandos MCP. - Un inicio de sesión con el navegador dura hasta que caduca la aprobación que elegiste, o hasta que cierras sesión. Una clave funciona hasta que se revoca.
Inicio de sesión con el navegador
openemail loginregistra una app nueva para este inicio de sesión, llamadaOpenEmail CLI on <your computer>, y abre la página de aprobación de OpenEmail en tu navegador. Si el navegador no se abre, usa el enlace que muestra.- Inicia sesión si hace falta y luego elige el espacio de trabajo, el acceso que recibe la CLI (lectura, lectura y envío, completo o tu propio conjunto de permisos), los dominios o direcciones que alcanza y cuánto dura la aprobación.
- Aprueba. El navegador devuelve la aprobación al terminal por sí solo y puedes cerrar la pestaña. La CLI muestra con quién has iniciado sesión, el espacio de trabajo y cuándo caduca la aprobación.
openemail loginopenemail login --scopes emails:send,threads:readopenemail login --profile work- La CLI espera 10 minutos a que apruebes. Elegir Ahora no en la página de aprobación cancela el inicio de sesión, con el código de salida
10. --scopespreselecciona permisos en la página de aprobación, y aún puedes cambiarlos allí.- Cuando el perfil ya tiene un inicio de sesión, un terminal pregunta antes de reemplazarlo. Sin supervisión se niega, salvo que pases
--forceo--yes. Reemplazar un inicio de sesión con el navegador revoca el anterior.
Cada inicio de sesión con el navegador es su propia app conectada, listada en Cuenta → Aplicaciones conectadas con el acceso que aprobaste, donde puedes cambiarlo o quitarla. openemail open apps abre esa página.
Por debajo está el flujo OAuth que usa el servidor MCP: un cliente público con PKCE, un código de un solo uso y un token de acceso que dura una hora y se renueva por ti. El navegador vuelve a 127.0.0.1 en un puerto aleatorio, y allí solo se acepta el código de este inicio de sesión.
Por SSH, o sin navegador
Cuando la CLI no puede abrir un navegador en esta máquina, muestra el enlace en su lugar: por SSH, en CI, en Linux sin pantalla, o cuando pasas --no-browser. Abre el enlace en un navegador de cualquier dispositivo y aprueba. La página muestra entonces un código de inicio de sesión, que pegas en el 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 código solo sirve para el inicio de sesión que mostró el enlace, así que un código de otra pestaña se rechaza.
- Pegar la dirección completa en la que terminó el navegador también funciona.
- Sin terminal, pasa el código por stdin.
Claves API
Una clave de API inicia la sesión de un script sin navegador, y nunca se le pide un código. Crea una en Configuración → Claves API (openemail open api-keys) con solo los scopes que necesita el script. La CLI comprueba la clave con GET /keys/self antes de guardarla, y acepta claves oe_live_ y oe_test_. El correo enviado con una clave de prueba nunca se entrega.
openemail login --with-token < ~/.config/openemail/keyecho "$OPENEMAIL_KEY" | openemail login --with-token --profile ciopenemail login --token oe_live_…--token también funciona, pero la clave acaba en el historial de tu shell, así que la CLI te avisa y sugiere --with-token. Hay dos formas de usar una clave sin guardarla:
OPENEMAIL_API_KEYen el entorno la usa cada comando que la ve, por delante de cualquier perfil guardado.--api-key <key>se usa para ese único comando.
Cuando hay más de una credencial, gana la primera de estas: --api-key, OPENEMAIL_API_KEY, el perfil indicado por --profile, el perfil indicado por OPENEMAIL_PROFILE, y después el perfil activo.
Perfiles
Un perfil es un inicio de sesión guardado, de cualquiera de los dos tipos. El primero se llama default. Inicia sesión en más con --profile y cambia entre ellos:
openemail login --profile workopenemail profile listopenemail profile use workopenemail inbox --profile defaultOPENEMAIL_PROFILE=work openemail statusopenemail profile currentopenemail profile remove workprofile listmuestra cada perfil con su tipo, espacio de trabajo y usuario o clave, y marca el activo. Su JSON nunca incluye un token ni una clave.profile currentmuestra solo el nombre en stdout, así que$(openemail profile current)funciona en un script.profile remove <name>es lo mismo queopenemail logout --profile <name>.- Un nombre de perfil tiene hasta 64 letras, dígitos, puntos, guiones y guiones bajos.
profile usetambién se llamaprofile switch. Quitar el perfil activo o cerrar su sesión deja sin perfil activo, y el siguiente comando que necesite una sesión te remite aopenemail profile use <name>.
Con qué API habla un inicio de sesión
Un perfil guardado recuerda la API en la que inició sesión, y su credencial solo se envía allí. Un --base-url o OPENEMAIL_BASE_URL que nombra otro origen detiene el comando con el código de salida 2 antes de enviar nada, y explica cómo iniciar sesión en ese origen con un perfil propio.
openemail login --profile other --base-url https://api.example.comopenemail inbox --profile other- Una clave de
OPENEMAIL_API_KEYo--api-keyno es un perfil guardado, así que va al origen de--base-urloOPENEMAIL_BASE_URL, o ahttps://api.openemail.ukcuando no hay ninguno de los dos. - Los comandos que no envían ninguna credencial siguen
--base-urlyOPENEMAIL_BASE_URLsea cual sea el perfil activo: bandejas desechables, métodos que no necesitan clave,docsyopen. - El
httpsin cifrar se rechaza para cualquier origen salvolocalhost,127.0.0.1y::1, con el código de salida2: la API, la app web, las solicitudes de inicio de sesión, de token y de revocación, y el servidor MCP. Usahttpspara todo lo demás. - Una ruta de solicitud que saldría del origen de la API, como
openemail api //example.com/x, se detiene con el código de salida2yinvalid_pathantes de enviar nada.
Lo que no puede hacer cada inicio de sesión
Un inicio de sesión con el navegador actúa como tú, pero algunas cosas nunca se aprueban para una app, elijas el acceso que elijas:
- Gestionar claves de API.
keys:writeykeys:managenunca se conceden, así que crear, rotar y revocar claves requiere una clave de API que tengakeys:manage, o la app web.openemail me rotaterota la clave con la que llamas, así que necesita una clave de API. - La facturación, y los propios espacios de trabajo. Los planes, las facturas y crear, cambiar o eliminar un espacio de trabajo siguen en la app web.
- Tu dirección gratuita. Una app se aprueba para un espacio de trabajo de empresa, y el espacio personal que tiene la dirección gratuita nunca se ofrece, con la misma regla que sigue la API.
- Miembros y roles, salvo que la aprobación cubra todo el espacio de trabajo.
members:writeyroles:writese quitan de una aprobación limitada a algunos dominios o direcciones.
Una clave de API tiene su propio límite. ai compose, ai summarize y cada comando openemail mcp salvo config pasan por el servidor MCP, que requiere un inicio de sesión con el navegador, así que con una clave se detienen con el código de salida 4 y dicen por qué.
Códigos de verificación
Con un inicio de sesión con el navegador, algunos cambios piden primero un código de verificación, como en la app web. La CLI lo pide cuando lo necesita: te envía por correo un código de seis dígitos o, si el inicio de sesión en dos pasos está activado, te pide un código de tu app de autenticación o uno de tus códigos de respaldo. Cuando el código es correcto, el comando se ejecuta, y a ese inicio de sesión no se le vuelve a pedir durante 60 minutos. A una clave de API nunca se le pide.
| Comando | Pide un código |
|---|---|
| webhooks create, update | Siempre |
| rules create, update | Siempre |
| roles update, delete | Siempre |
| members add, update, remove | Siempre |
| members grant-address, revoke-address | Siempre |
| domains delete, delete-address | Siempre |
| audiences delete | Para una audiencia que creaste |
| audiences empty | Para una audiencia que creaste y que aún tiene contactos |
| mcp call createRule, setRuleEnabled | Siempre |
| mcp call removeDomain, removeDomainAddress | Siempre |
| mcp call deleteAudience, emptyAudience | Como el comando de audiencia correspondiente |
| api | Cuando la operación que llama es una de las anteriores |
$ 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.- Escribe
ren la solicitud para que se vuelva a enviar el correo. Un código incorrecto dice cuántos intentos quedan. - Tras aceptarse el código, el comando se ejecuta una vez más, nunca dos.
--yesconfirma una eliminación, pero nunca se salta un código.- Sin supervisión (con
--jsono--no-input, en CI o sin terminal) nadie puede escribir el código, así que el comando se detiene con el código de salida4y no cambia nada. - Un código permite 5 intentos, y tras el quinto incorrecto la CLI ofrece un código nuevo. Cada inicio de sesión puede pedir 5 códigos por hora y 20 al día.
- Diez códigos incorrectos para un inicio de sesión en 24 horas pausan su verificación. La CLI dice entonces cuándo se reanuda y se detiene con el código de salida
4ystep_up_paused, sin ofrecer otro código, y el correo que lo explica nombra la app.
Ejecuta openemail verify antes de que un script o un cliente de IA haga algo delicado. Pide el código ahora, y durante los 60 minutos siguientes cada comando de ese perfil se ejecuta sin él, incluidos openemail mcp call y el puente MCP local.
openemail verifyopenemail verify --statusopenemail verify --status --jsonopenemail verify --forceLos 60 minutos pertenecen a un único inicio de sesión. A otro perfil, o a un cliente de IA que inició sesión por su cuenta, se le pide su propio código, y cerrar sesión los termina de inmediato. --force pide un código nuevo y empieza 60 minutos nuevos.
Caducidad, cierre de sesión y revocación
- El token de acceso de un inicio de sesión con el navegador dura una hora. La CLI lo renueva antes de que caduque y guarda el nuevo, así que nunca lo notas.
- Cada token de actualización sirve una sola vez. Uno antiguo usado más de 30 segundos después de que la CLI lo sustituyera, por ejemplo desde una copia de
config.jsonen otra máquina, hace que el servidor revoque ese inicio de sesión por completo, así que inicia sesión en cada máquina en lugar de copiar el archivo. - La aprobación dura lo que elegiste en la página de aprobación. Cuando termina, o cuando la app se quita en Cuenta → Aplicaciones conectadas, la CLI ya no puede actuar por ti y te pide que vuelvas a ejecutar
openemail login. openemail logoutrevoca un inicio de sesión con el navegador en el servidor, lo que lo quita de las aplicaciones conectadas, y luego lo olvida en este dispositivo, aunque no se pueda contactar con el servidor.--allcierra la sesión de cada perfil.- Cerrar la sesión de una clave de API solo la olvida aquí. La clave sigue funcionando hasta que la revoques, con
openemail keys revoke <id>o en la app web.
Dónde se guardan los inicios de sesión
Todo vive en ~/.openemail, o en la carpeta que indique OPENEMAIL_CONFIG_DIR. Solo tú puedes leer la carpeta (0700), y lo mismo cada archivo que contiene (0600). Cada archivo se escribe en un archivo temporal y se renombra en su sitio, para que un fallo nunca deje uno a medias, y cada cambio se hace bajo un archivo de bloqueo, para que los comandos que se ejecutan a la vez nunca pierdan un perfil.
| Archivo | Qué contiene |
|---|---|
| config.json | Tus perfiles: claves de API, tokens de acceso y de actualización, y qué perfil está activo |
| temp-mail.json | Las bandejas desechables que creó esta CLI, con sus tokens de bandeja |
| update-check.json | Cuándo se preguntó a npm por última vez por una versión nueva, y qué respondió |
Los tokens y las claves se guardan en texto plano en archivos que solo tu usuario puede leer, así que trata la carpeta como una clave SSH. Un archivo que la CLI no entiende nunca se toma en silencio como una sesión cerrada: avisa una vez con la ruta y guarda una copia al lado (config.json.bak) antes de escribir uno nuevo. Un archivo que no puede leer en absoluto, por ejemplo por sus permisos, detiene el comando con un error que lo nombra.