Ir a la documentación
CLI

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.

ComandoActúa comoCódigos de verificación
openemail loginTú, en el espacio de trabajo y con el acceso que apruebesSe pide antes de algunos cambios delicados
openemail login --with-tokenEl espacio de trabajo, con los scopes que tiene la claveNunca se pide
  • Solo un inicio de sesión con el navegador puede usar ai compose, ai summarize y 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

  1. openemail login registra una app nueva para este inicio de sesión, llamada OpenEmail 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.
  2. 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.
  3. 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.
Terminal
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.
  • --scopes preselecciona 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 --force o --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.

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.

Terminal
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_KEY en 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:

Terminal
openemail login --profile workopenemail profile listopenemail profile use workopenemail inbox --profile defaultOPENEMAIL_PROFILE=work openemail statusopenemail profile currentopenemail profile remove work
  • profile list muestra 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 current muestra solo el nombre en stdout, así que $(openemail profile current) funciona en un script.
  • profile remove <name> es lo mismo que openemail logout --profile <name>.
  • Un nombre de perfil tiene hasta 64 letras, dígitos, puntos, guiones y guiones bajos.
  • profile use también se llama profile 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 a openemail 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.

Terminal
openemail login --profile other --base-url https://api.example.comopenemail inbox --profile other
  • Una clave de OPENEMAIL_API_KEY o --api-key no es un perfil guardado, así que va al origen de --base-url o OPENEMAIL_BASE_URL, o a https://api.openemail.uk cuando no hay ninguno de los dos.
  • Los comandos que no envían ninguna credencial siguen --base-url y OPENEMAIL_BASE_URL sea cual sea el perfil activo: bandejas desechables, métodos que no necesitan clave, docs y open.
  • El http sin cifrar se rechaza para cualquier origen salvo localhost, 127.0.0.1 y ::1, con el código de salida 2: la API, la app web, las solicitudes de inicio de sesión, de token y de revocación, y el servidor MCP. Usa https para 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 salida 2 y invalid_path antes 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:write y keys:manage nunca se conceden, así que crear, rotar y revocar claves requiere una clave de API que tenga keys:manage, o la app web. openemail me rotate rota 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:write y roles:write se 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.

ComandoPide un código
webhooks create, updateSiempre
rules create, updateSiempre
roles update, deleteSiempre
members add, update, removeSiempre
members grant-address, revoke-addressSiempre
domains delete, delete-addressSiempre
audiences deletePara una audiencia que creaste
audiences emptyPara una audiencia que creaste y que aún tiene contactos
mcp call createRule, setRuleEnabledSiempre
mcp call removeDomain, removeDomainAddressSiempre
mcp call deleteAudience, emptyAudienceComo el comando de audiencia correspondiente
apiCuando la operación que llama es una de las anteriores
Terminal
$ 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 r en 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.
  • --yes confirma una eliminación, pero nunca se salta un código.
  • Sin supervisión (con --json o --no-input, en CI o sin terminal) nadie puede escribir el código, así que el comando se detiene con el código de salida 4 y 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 4 y step_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.

Terminal
openemail verifyopenemail verify --statusopenemail verify --status --jsonopenemail verify --force

Los 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.json en 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 logout revoca 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. --all cierra 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.

ArchivoQué contiene
config.jsonTus perfiles: claves de API, tokens de acceso y de actualización, y qué perfil está activo
temp-mail.jsonLas bandejas desechables que creó esta CLI, con sus tokens de bandeja
update-check.jsonCuá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.

Tu bandeja de entrada,
en tus propios términos.

Infraestructura de correo para empresas, IA, agentes y correo personal. Creada para escalar, con privacidad y control. Todo lo que el correo debería haber tenido desde el primer día.

OpenEmail

Infraestructura de correo para empresas, IA, agentes y correo personal. Creada para escalar, con privacidad y control. Todo lo que el correo debería haber tenido desde el primer día.

© 2026 OpenEmail. Todos los derechos reservados.