Аутентификация
Входите через браузер или API-ключ, держите несколько профилей и подтверждайте код перед чувствительным изменением.
Два способа войти
Запустите openemail login в терминале, и она спросит, какой способ вам нужен. В обоих случаях вход сохраняется как профиль, и каждая следующая команда использует активный.
| Команда | Действует как | Коды подтверждения |
|---|---|---|
| openemail login | Вы, в рабочем пространстве и с тем доступом, который вы одобрили | Спрашивается перед некоторыми чувствительными изменениями |
| openemail login --with-token | Рабочее пространство, со scope, которые есть у ключа | Никогда не спрашивается |
- Только вход через браузер может пользоваться
ai compose,ai summarizeи командами MCP. - Вход через браузер действует, пока не истечёт выбранное одобрение или пока вы не выйдете. Ключ работает, пока его не отзовут.
Вход через браузер
openemail loginрегистрирует для этого входа новое приложение с именемOpenEmail CLI on <your computer>и открывает страницу одобрения OpenEmail в вашем браузере. Если браузер не открылся, воспользуйтесь выведенной ссылкой.- Войдите, если нужно, затем выберите рабочее пространство, доступ CLI (чтение, чтение и отправка, полный или свой набор разрешений), домены или адреса, до которых она дотягивается, и срок одобрения.
- Одобрите. Браузер сам вернёт одобрение в терминал, и вкладку можно закрыть. CLI покажет, под кем вы вошли, рабочее пространство и когда истекает одобрение.
openemail loginopenemail login --scopes emails:send,threads:readopenemail login --profile work- CLI ждёт одобрения 10 минут. Если выбрать «Не сейчас» на странице одобрения, вход отменяется с кодом выхода
10. --scopesзаранее отмечает разрешения на странице одобрения, и там их ещё можно изменить.- Если в профиле уже есть вход, терминал спросит, прежде чем заменить его. Без присмотра она откажется, если вы не передадите
--forceили--yes. Замена входа через браузер отзывает старый.
Каждый вход через браузер это отдельное подключённое приложение, которое видно в разделе «Аккаунт → Подключённые приложения» с одобренным доступом; там его можно изменить или удалить. openemail open apps открывает эту страницу.
В основе лежит поток OAuth, который использует MCP-сервер: публичный клиент с PKCE, одноразовый код и токен доступа, который действует час и обновляется за вас. Браузер возвращается на 127.0.0.1 на случайном порту, и там принимается только код этого входа.
Через SSH или без браузера
Если CLI не может открыть браузер на этой машине, она выводит ссылку: через SSH, в CI, в Linux без дисплея или когда вы передаёте --no-browser. Откройте ссылку в браузере на любом устройстве и одобрите. Страница покажет код входа, который вы вставите в терминал.
$ 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- Код подходит только для того входа, который вывел ссылку, поэтому код из другой вкладки отклоняется.
- Можно вставить и весь адрес, на котором остановился браузер.
- Без терминала передайте код через stdin.
API-ключи
API-ключ выполняет вход скрипта без браузера, и код у него никогда не спрашивают. Создайте ключ в разделе «Настройки → API-ключи» (openemail open api-keys) только с теми scope, которые нужны скрипту. CLI проверяет ключ через GET /keys/self перед сохранением и принимает ключи oe_live_ и oe_test_. Почта, отправленная с тестовым ключом, никогда не доставляется.
openemail login --with-token < ~/.config/openemail/keyecho "$OPENEMAIL_KEY" | openemail login --with-token --profile ciopenemail login --token oe_live_…--token тоже работает, но ключ попадает в историю оболочки, поэтому CLI предупреждает и предлагает --with-token. Есть два способа использовать ключ, не сохраняя его:
OPENEMAIL_API_KEYв окружении использует каждая команда, которая его видит, раньше любого сохранённого профиля.--api-key <key>используется для одной этой команды.
Если учётных данных несколько, побеждает первое из этого списка: --api-key, OPENEMAIL_API_KEY, профиль из --profile, профиль из OPENEMAIL_PROFILE, затем активный профиль.
Профили
Профиль это один сохранённый вход любого из двух видов. Первый называется default. Добавляйте другие через --profile и переключайтесь между ними:
openemail login --profile workopenemail profile listopenemail profile use workopenemail inbox --profile defaultOPENEMAIL_PROFILE=work openemail statusopenemail profile currentopenemail profile remove workprofile listпоказывает каждый профиль с видом, рабочим пространством и пользователем или ключом и отмечает активный. Его JSON никогда не содержит токен или ключ.profile currentвыводит в stdout только имя, поэтому$(openemail profile current)работает в скрипте.profile remove <name>делает то же, чтоopenemail logout --profile <name>.- Имя профиля длиной до 64 символов из букв, цифр, точек, дефисов и подчёркиваний.
profile useтакже называетсяprofile switch. Если удалить активный профиль или выйти из него, активного профиля не останется, и следующая команда, которой нужен вход, подскажетopenemail profile use <name>.
С каким API работает вход
Сохранённый профиль помнит API, в который он вошёл, и его учётные данные отправляются только туда. --base-url или OPENEMAIL_BASE_URL с другим адресом останавливает команду с кодом выхода 2 до любой отправки и объясняет, как войти по этому адресу отдельным профилем.
openemail login --profile other --base-url https://api.example.comopenemail inbox --profile other- Ключ из
OPENEMAIL_API_KEYили--api-keyне сохранённый профиль, поэтому он уходит по адресу из--base-urlилиOPENEMAIL_BASE_URL, либо наhttps://api.openemail.uk, если не задано ни то ни другое. - Команды, которые не отправляют учётных данных, следуют
--base-urlиOPENEMAIL_BASE_URL, какой бы профиль ни был активен: одноразовые ящики, методы, которым не нужен ключ,docsиopen. - Обычный
httpотклоняется для любого адреса, кромеlocalhost,127.0.0.1и::1, с кодом выхода2: для API, веб-приложения, запросов входа, токенов и отзыва, а также сервера MCP. Для всего остального используйтеhttps. - Путь запроса, который вышел бы за пределы адреса API, например
openemail api //example.com/x, останавливается с кодом выхода2иinvalid_pathдо любой отправки.
Чего не может каждый вход
Вход через браузер действует от вашего имени, но некоторые вещи приложению не одобряются никогда, какой бы доступ вы ни выбрали:
- Управление API-ключами.
keys:writeиkeys:manageникогда не выдаются, поэтому для создания, ротации и отзыва ключей нужен API-ключ сkeys:manageили веб-приложение.openemail me rotateротирует ключ, которым вы вызываете, поэтому ему нужен API-ключ. - Оплата и сами рабочие пространства. Тарифы, счета, а также создание, переключение и удаление рабочего пространства остаются в веб-приложении.
- Ваш бесплатный адрес. Приложение одобряется для рабочего пространства компании, а личное пространство с бесплатным адресом никогда не предлагается, по тому же правилу, что и в API.
- Участники и роли, если одобрение не охватывает всё рабочее пространство.
members:writeиroles:writeубираются из одобрения, ограниченного некоторыми доменами или адресами.
У API-ключа есть своё ограничение. ai compose, ai summarize и каждая команда openemail mcp, кроме config, идут через MCP-сервер, которому нужен вход через браузер, поэтому с ключом они завершаются с кодом выхода 4 и объясняют почему.
Коды подтверждения
При входе через браузер некоторые изменения сначала спрашивают код подтверждения, как в веб-приложении. CLI спрашивает его, когда он нужен: присылает на почту шестизначный код или, если включён двухфакторный вход, просит код из приложения-аутентификатора или один из резервных кодов. Когда код верен, команда выполняется, и у этого входа 60 минут больше ничего не спрашивают. У API-ключа код не спрашивают никогда.
| Команда | Просит код |
|---|---|
| webhooks create, update | Всегда |
| rules create, update | Всегда |
| roles update, delete | Всегда |
| members add, update, remove | Всегда |
| members grant-address, revoke-address | Всегда |
| domains delete, delete-address | Всегда |
| audiences delete | Для созданной вами аудитории |
| audiences empty | Для созданной вами аудитории, в которой ещё есть контакты |
| mcp call createRule, setRuleEnabled | Всегда |
| mcp call removeDomain, removeDomainAddress | Всегда |
| mcp call deleteAudience, emptyAudience | Как соответствующая команда для аудиторий |
| api | Когда вызываемая операция входит в список выше |
$ 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.- Введите
rв приглашении, чтобы письмо отправили снова. Неверный код сообщает, сколько попыток осталось. - После того как код принят, команда выполняется ещё один раз, никогда не дважды.
--yesподтверждает удаление, но никогда не пропускает код.- Без присмотра (с
--jsonили--no-input, в CI или без терминала) ввести код некому, поэтому команда завершается с кодом выхода4и ничего не меняет. - Код даёт 5 попыток, а после пятой неверной CLI предлагает новый код. Каждый вход может запросить 5 кодов в час и 20 в день.
- Десять неверных кодов для одного входа за 24 часа ставят его подтверждение на паузу. CLI тогда сообщает, когда оно возобновится, и останавливается с кодом выхода
4иstep_up_paused, не предлагая другой код, а письмо с объяснением называет приложение.
Запустите openemail verify, прежде чем скрипт или ИИ-клиент сделает что-то чувствительное. Она спросит код сейчас, и следующие 60 минут каждая команда этого профиля работает без него, включая openemail mcp call и локальный MCP-мост.
openemail verifyopenemail verify --statusopenemail verify --status --jsonopenemail verify --force60 минут принадлежат одному входу. Другой профиль или ИИ-клиент, вошедший сам, получит запрос собственного кода, а выход сразу их завершает. --force запрашивает новый код и начинает новые 60 минут.
Срок действия, выход и отзыв
- Токен доступа за входом через браузер действует час. CLI обновляет его до истечения и сохраняет новый, так что вы этого не замечаете.
- Каждый токен обновления срабатывает один раз. Старый токен, использованный больше чем через 30 секунд после того, как CLI его заменила, например из копии
config.jsonна другой машине, заставляет сервер полностью отозвать этот вход. Поэтому входите на каждой машине, а не копируйте файл. - Одобрение действует столько, сколько вы выбрали на странице одобрения. Когда оно заканчивается или приложение удаляют в разделе «Аккаунт → Подключённые приложения», CLI больше не может действовать за вас и просит снова запустить
openemail login. openemail logoutотзывает вход через браузер на сервере, что убирает его из подключённых приложений, а затем забывает его на этом устройстве, даже если сервер недоступен.--allвыходит из каждого профиля.- Выход из API-ключа только забывает его здесь. Ключ продолжает работать, пока вы его не отзовёте через
openemail keys revoke <id>или в веб-приложении.
Где хранятся входы
Всё лежит в ~/.openemail или в папке, которую указывает OPENEMAIL_CONFIG_DIR. Папку можете читать только вы (0700), как и каждый файл в ней (0600). Каждый файл пишется во временный файл и переименовывается на место, поэтому сбой никогда не оставит половину файла, а каждое изменение делается под файлом блокировки, поэтому команды, запущенные одновременно, никогда не теряют профиль.
| Файл | Что в нём |
|---|---|
| config.json | Ваши профили: API-ключи, токены доступа и обновления и какой профиль активен |
| temp-mail.json | Одноразовые ящики, созданные этой CLI, с их токенами ящиков |
| update-check.json | Когда npm в последний раз спрашивали о новом выпуске и что он ответил |
Токены и ключи хранятся открытым текстом в файлах, которые может читать только ваш пользователь, поэтому относитесь к папке как к SSH-ключу. Файл, который CLI не может разобрать, никогда молча не считается выходом: она один раз предупреждает с путём и сохраняет рядом копию (config.json.bak), прежде чем записать новый. Файл, который она вообще не может прочитать, например из-за его прав доступа, останавливает команду с ошибкой, где он назван.