Ключи, участники и роли
Управляйте API-ключами и читайте, что они делали, приглашайте участников и управляйте ими, пишите роли, проверяйте учётные данные, которыми пользуетесь, и создавайте одноразовые ящики.
Обзор
Эти команды решают, кто и что может достучаться до рабочего пространства. openemail keys управляет API-ключами и читает, что сделал каждый, openemail members управляет людьми в рабочем пространстве и их приглашениями, а openemail roles определяет, что может делать участник или ключ. openemail me описывает ключ или вход, которым вы вызываете, а openemail languages перечисляет языки, которые принимает отправка с переводом. Одноразовым ящикам вход не нужен вовсе: openemail temp это обычный способ ими пользоваться, а openemail temp-mail это каждый вызов API, который за ним стоит. openemail api достаёт до любого эндпоинта, до которого не достают другие команды.
- Команда ключа принимает идентификатор ключа, 24 шестнадцатеричных символа после
oe_live_, как его показываетkeys list. Команда участника принимает идентификатор аккаунта,userIdвmembers list, и никогда не адрес почты. Команда роли принимает идентификаторrole_изroles list, потому что роли нельзя найти по имени. - Пространства имён откликаются также на
key,member,role,languageиtempMail. Работают обычные псевдонимы глаголов, такие какls,show,new,editиrm. Вmembers, где глаголы называютсяaddиremove,newиcreateведут кadd, аrm,delиdeleteведут кremove. openemail <command> --helpперечисляет каждый аргумент и флаг с типом, scope, который нужен вызову, методом и путём и тем, что возвращается. Добавьте--json, чтобы получить ту же страницу как данные.
Все команды
| Команда | Что делает |
|---|---|
| openemail me get | Описать API-ключ или вход через браузер, которым вы вызываете: его scope, роль, которая его ограничивает, рабочее пространство и от имени кого он может отправлять. Scope не нужен |
| openemail me ping | Проверить, что учётные данные проходят аутентификацию, для проверки работоспособности. Scope не нужен |
| openemail me rotate | Дать API-ключу, которым вы вызываете, новый секрет, показанный один раз. Просит подтверждения |
| openemail keys list | Показать API-ключи рабочего пространства, новые сверху, со статусом, scope, ролью, областью отправки и последним использованием. Никогда не секрет |
| openemail keys get <id> | Прочитать один ключ, без его секрета |
| openemail keys create --name <value> | Выпустить ключ и один раз получить его секрет в token |
| openemail keys update <id> | Переименовать ключ, заменить его scope или область отправки либо выключить и включить его через --no-enabled и --enabled |
| openemail keys delete <id> | Убрать отозванный ключ из списка, сохранив его историю. Просит подтверждения |
| openemail keys rotate <id> | Дать ключу новый секрет, показанный один раз, и сразу остановить старый. Просит подтверждения |
| openemail keys revoke <id> | Отозвать ключ навсегда, с необязательным --reason. Просит подтверждения |
| openemail keys list-requests <id> | Прочитать журнал запросов одного ключа: метод, путь, статус, код ошибки, длительность, IP и user agent |
| openemail keys list-activity <id> | Прочитать, что происходило с одним ключом: создание, изменение, ротация, выключение и включение, отзыв, удаление и каждый отклонённый вызов |
| openemail keys list-workspace-requests | Прочитать журнал запросов всех ключей, которые вам видны, или тех, что названы в --key-ids |
| openemail keys list-workspace-activity | Прочитать, что происходило со всеми ключами, которые вам видны, или с теми, что названы в --key-ids |
| openemail roles list | Показать роли рабочего пространства, сначала встроенные, с числом участников и ключей, у которых есть каждая |
| openemail roles get <id> | Прочитать одну роль с её разрешениями и текущими счётчиками использования |
| openemail roles create --name <value> --permissions <a,b> | Создать собственную роль с необязательным --description |
| openemail roles update <id> | Переименовать роль, изменить её описание или заменить весь список разрешений |
| openemail roles delete <id> | Удалить роль и перевести всех, у кого она была, на роль из --reassign-to. Просит подтверждения |
| openemail roles list-permissions | Показать словарь разрешений с подписью, группой и тем, может ли ключ иметь каждое |
| openemail members list | Показать всех, у кого есть доступ, сначала владельца, с их ролью, разрешениями и адресами и доменами, которыми может пользоваться каждый |
| openemail members get <user-id> | Прочитать одного участника по идентификатору аккаунта |
| openemail members add --email <value> --role-id <value> | Пригласить кого-то с ролью, а также с адресами или целыми доменами через --address-ids, --domain-ids и --access |
| openemail members update <user-id> --role-id <value> | Перевести участника на другую роль. Выданные ему адреса и домены остаются как есть |
| openemail members remove <user-id> | Убрать кого-то из рабочего пространства вместе со всеми выданными ему адресами. Просит подтверждения |
| openemail members grant-address <user-id> --address-id <value> | Выдать участнику один адрес или изменить его --access к нему |
| openemail members revoke-address <user-id> <address-id> | Забрать у участника один адрес. Просит подтверждения |
| openemail members list-invitations | Показать приглашения, которые ещё никто не принял, включая истёкшие |
| openemail members revoke-invitation <invitation-id> | Отозвать приглашение, чтобы его ссылка перестала работать. Просит подтверждения |
| openemail members resend-invitation <invitation-id> | Снова отправить приглашение с новой ссылкой и ещё 14 днями |
| openemail languages list | Показать все языки, которые принимает отправка с переводом, в том порядке, в каком их должен показывать выбор. Scope не нужен |
| openemail temp new [--name <local-part>] [--domain <domain>] [--ttl <minutes>] | Создать одноразовый ящик и вывести только его адрес. Вход не нужен |
| openemail temp list | Показать одноразовые ящики, созданные этой CLI, не обращаясь к сети |
| openemail temp read [inbox] [message-id] | Показать почту в ящике или вывести одно письмо читаемым текстом |
| openemail temp watch [inbox] [--first] | Выводить каждое новое письмо по мере прихода, проверяя каждые 3 секунды |
| openemail temp delete [inbox] [--yes] | Удалить ящик и его почту сейчас и забыть его токен. Просит подтверждения |
| openemail temp-mail list-domains | Показать домены, на которых можно создать одноразовый ящик. Учётные данные не нужны |
| openemail temp-mail create | Создать одноразовый ящик и его токен, который CLI сохраняет. Учётные данные не нужны |
| openemail temp-mail get <inbox-id> | Прочитать срок действия ящика, оставшиеся продления и число писем |
| openemail temp-mail extend <inbox-id> | Отодвинуть срок действия ещё до часа вперёд, в пределах 24 часов с создания ящика |
| openemail temp-mail delete <inbox-id> | Уничтожить ящик и его почту сейчас. Просит подтверждения |
| openemail temp-mail list-messages <inbox-id> | Показать одну страницу писем, новые сверху, каждое с коротким текстовым фрагментом |
| openemail temp-mail get-message <inbox-id> <message-id> | Прочитать одно письмо с сохранённым телом и отметить его просмотренным |
| openemail temp-mail delete-message <inbox-id> <message-id> | Удалить одно письмо с его телом и вложениями. Просит подтверждения |
| openemail temp-mail list-attachments <inbox-id> <message-id> | Прочитать вложения письма с байтами в base64 |
| openemail api <method> <path> | Вызвать любой эндпоинт REST с вашим входом, его кодами подтверждения и подтверждениями |
Все флаги есть в справке своей команды, например openemail keys create --help, openemail members add --help или openemail temp new --help.
API-ключи
Для чтения ключей нужен keys:read, а для каждого изменения keys:manage. Входу через браузер никогда не выдаются keys:write и keys:manage, поэтому создание, изменение, ротация, отзыв и удаление ключей требуют API-ключа с keys:manage или веб-приложения (openemail open api-keys). Вход через браузер с keys:read читает ключи только у владельца рабочего пространства, а вход участника отклоняется с 403 owner_only.
keys create,keys rotateиme rotateодин раз выводят секрет ключа вtoken, и CLI затем предупреждает, что больше его не покажут. Каждое чтение вместо этого показываетmaskedKey.- Если их не указать, новый ключ получает только
emails:sendи берёт роль, область отправки и срок действия ключа, который его создаёт.--domain-allowlistи--address-allowlistзадают, от имени кого он может отправлять, а--expires-in-minutesпринимает от 5 до 5 256 000, то есть десять лет. - Ключ никогда не создаёт и не достаёт ключ шире себя. Scope, роль, срок действия, режим и область отправки должны лежать внутри вызывающего ключа, иначе вызов отклоняется с 403
beyond_caller_authority, аparamназывает то, что оказалось слишком широким. Ключ, суженный до некоторых доменов или адресов, видит только ключи внутри своей области отправки, а любой другой даёт 404. keys updateзаменяет то, что вы отправили:--scopes,--address-allowlistи--domain-allowlistкаждый принимают весь новый список, а флаг, который вы не указали, остаётся как был.--no-enabledвыключает ключ, так что каждый вызов с ним отклоняется сinactive_api_key, а--enabledв точности его восстанавливает. Так ключ останавливают обратимо.keys revokeдействует навсегда: ключ больше никогда нельзя включить, ротировать или изменить.keys deleteубирает только отозванный ключ, а любой другой отклоняется с 409not_revoked. Журнал запросов и активность удалённого ключа остаются, под пометкой «Удалённый ключ».- У
keys rotateнет окна перекрытия, поэтому старый секрет перестаёт работать в тот момент, когда возвращается новый. Если это ключ, которым пользуется ваш сохранённый профиль, CLI сохраняет новый секрет в этот профиль, и он продолжает работать. Ключ изOPENEMAIL_API_KEYили--api-keyсохранить нельзя, поэтому CLI просит положить новый токен туда, где хранился старый ключ.
Журнал запросов записывает каждый вызов ключа: метод, путь, статус, код ошибки, длительность, IP и user agent, но никогда не тело и не строку запроса. Ничего не удаляется, поэтому он уходит назад до первого вызова ключа, а вызовов со входом через браузер в нём нет. Журнал активности записывает каждое изменение ключа и каждый вызов, который предъявил ключ и был отклонён, как auth_failed, а кто сделал каждое изменение, указано в actor.
list-requestsиlist-activityчитают один ключ.list-workspace-requestsиlist-workspace-activityчитают все ключи, которые вам видны, или до 50, названных в--key-ids, включая удалённые.--sinceи--untilзадают период и принимают время ISO 8601, например2026-09-01T00:00:00Z.--failed-onlyоставляет вызовы, на которые ответили статусом 400 или выше.
Ваши учётные данные и языки
openemail me get это первая команда, которую стоит запустить, когда вызов отклонён. Ей не нужен scope, поэтому любой действующий ключ или вход может описать себя.
scopesэто то, что учётные данные могут делать прямо сейчас: scope, с которыми они созданы, урезанные ролью, под которой они выпущены, и вычисляемые при каждом запросе.grantedScopesэто то, с чем они созданы, аroleIdназывает роль. Scope, который есть вgrantedScopesи отсутствует вscopes, убрала роль. Это обычная причина 403insufficient_scopeу ключа, у которого scope вроде бы есть, и исправлять нужно роль, а не выпускать ещё один ключ.domainAllowlistиaddressAllowlistговорят, от имени кого можно отправлять. Если оба null, это любой адрес, которым владеет рабочее пространство.- При входе через браузер она описывает вход:
objectравенoauth_token,clientIdназывает подключённое приложение этой CLI, аexpiresAtэто момент, когда заканчивается ваше одобрение, или null, если оно не заканчивается никогда. me pingотвечаетok: trueс теми же сведениями о scope, но без списков разрешённых, что подходит для проверки работоспособности. Отозванный, истёкший, выключенный или набранный с ошибкой ключ не проходит с 401 и кодом выхода3.me rotateдаёт ключу, которым вы вызываете, новый секрет. Ему нуженkeys:write, которого у входа через браузер никогда не бывает, поэтому нужен API-ключ. Всё остальное в ключе сохраняется, старый секрет сразу перестаёт работать, а сохранённый профиль получает новый, как сkeys rotate. Потерянный ответ может оставить ключ с секретом, который никто не видел, и тогда ему нужен новый из веб-приложения.openemail whoamiпоказывает тот же ответ, отформатированный для людей.
openemail languages list выводит всю таблицу языков одним ответом, около двухсот строк, с кодом каждого языка, английским названием, собственным названием, флагом и тем, пишется ли он справа налево. Код, английское название и собственное название одинаково работают как цель отправки с переводом. Ей нужен вход, но не scope. openemail ai languages выводит ту же таблицу с флагом --search, а без входа выводит таблицу, встроенную в CLI.
Участники и роли
У участника есть две вещи, которые никогда не смешиваются. Роль говорит, что он может делать, а выданные адреса и домены говорят, с какой почтой, причём у каждой выдачи свой доступ: member читает и отправляет, а viewer только читает. Отправке нужно и то и другое, поэтому роль с emails:send и выдача viewer на адрес всё равно не позволяют отправлять с него. Целый домен охватывает каждый адрес на нём, включая созданные позже.
members listставит владельца рабочего пространства первым с пометкойisOwner, поэтому не учитывайте эту строку при подсчёте мест. У владельца есть все разрешения, и его нельзя пригласить, изменить или удалить, как нельзя и снова пригласить того, кто уже в рабочем пространстве: в обоих случаях 422member_is_owner.- Люди, у которых есть выданные адреса, но которым никогда не давали роль, возвращаются с
implied: true, и их роль выводится из выданного.members updateдаёт им настоящую. members addотправляет приглашение, даже тому, у кого уже есть аккаунт. Ничего не выдаётся, пока он не примет, а затем выдаются ровно те роль, адреса и домены, которые несёт приглашение. Повторное приглашение того же адреса в течение десяти минут даёт 409invitation_too_soon, а после этого обновляет ожидающее приглашение вместо отправки второго.resend-invitationотправляет новую ссылку, действующую ещё 14 дней, и выводит из строя старую, что также продлевает истёкшее приглашение.revoke-invitationотзывает приглашение, а уже принятое приглашение даёт 409invitation_accepted, так что вместо этого удалите участника.members updateменяет роль и ничего больше.grant-addressвыдаёт один адрес или меняет доступ к нему, поэтому повторный запуск с другим--accessменяет выдачу, а не добавляет вторую.revoke-addressзабирает один адрес и оставляет остальные. Отзыв последней выдачи у участника с выведенной ролью убирает его из рабочего пространства.members removeпрекращает доступ человека к рабочему пространству, его членство и каждую выдачу и сообщает вaddressesRevoked, сколько выданных адресов ушло. Его аккаунт и отправленная им почта не затрагиваются.
Роль также служит потолком для API-ключей, выпущенных под ней. То, что может ключ, это его собственные scope, урезанные разрешениями его роли и вычисляемые при каждом запросе.
roles listпоказывает сначала встроенные роли в порядке Owner, Admin, Member, Viewer, Developer и Billing, затем собственные роли по имени. В рабочем пространстве может быть до 24 собственных ролей, а сверх этогоroles createдаёт 422role_limit_reached.- Роль хранит и те разрешения, которые подразумевают её разрешения, поэтому
templates:writeсохраняет ещё иtemplates:read, аroles:writeприноситroles:readиmembers:read. Читайте список из ответа, а не предполагайте его. roles update --permissionsзаменяет весь список, поэтому прочитайте роль, измените список и отправьте его целиком.--description nullочищает описание. Изменение действует со следующего вызова каждого участника и ключа, у которых есть эта роль.- Каждую роль, кроме Owner, можно переименовать, переписать и удалить, включая встроенные, и удалённая встроенная роль не возвращается. Роль владельца отвечает на правку 409
role_immutable, а на удаление 409role_undeletable. - Пока роль есть у какого-либо участника, API-ключа или ожидающего приглашения,
roles deleteнужен--reassign-toс ролью, которая их примет, иначе вызов отклоняется с 409role_in_use. Отозванные ключи по-прежнему указывают на свою роль, поэтому он может понадобиться и роли, у которой счётчикapiKeysравен 0. Ответ сообщает о переведённых людях вreassignedи о ключах вkeysReassigned. roles list-permissionsперечисляет весь словарь с подписью и группой для каждого. Несколько, такие какbilling:writeиworkspace:manage, возвращаются сscope: false: роль может их иметь, а ключ нет.
Ключ с roles:write может отредактировать роль, которая его ограничивает, и расширить себя при следующем вызове, поэтому не давайте этот scope ключам, которым нужно только читать. При входе через браузер members:write и roles:write выдаются, только когда одобрение охватывает всё рабочее пространство, а не некоторые домены или адреса.
Одноразовые ящики
Одноразовому ящику не нужны ни аккаунт, ни вход. К нему обращаются по его собственному токену ящика, который начинается с oe_inbox_ и возвращается один раз, при создании ящика. Пользуйтесь openemail temp каждый день, а openemail temp-mail, когда нужно поле или шаг, которых temp не показывает, например оставшиеся продления, продление или байты вложения.
- Обе хранят токен в
~/.openemail/temp-mail.json, который можете читать только вы.temp newиtemp-mail createсохраняют его,temp listпоказывает ящики, созданные любым из способов, а обе команды удаления его забывают. Сохранённый ящик можно назвать его адресом везде, где команда просит идентификатор. - Для ящика, который создавала не эта CLI, передайте токен через
--inbox-token. Если нет ни сохранённого, ни переданного токена, команда останавливается с кодом выхода3до любой отправки. - Две команды создания называют флаги по-разному:
temp newпринимает--name,--domainи--ttl, аtemp-mail createпринимает--local-part,--domainи--ttl-minutes. Локальная часть это от 3 до 32 букв, цифр, точек, дефисов или подчёркиваний, начинающаяся и заканчивающаяся буквой или цифрой, а такие имена, какpostmaster, отклоняются. Аренда длится от 1 до 1440 минут, по умолчанию 60. - С каждого IP-адреса можно создать 6 ящиков в час и 30 в день, а следующий даёт 429
too_many_inboxesс кодом выхода8. Продление ящика, который у вас уже есть, не считается, поэтому ответ на этот предел этоtemp-mail extend. temp-mail extendдобавляет до часа, никогда не дальше 24 часов после создания ящика и не больше 23 раз. ЧитайтеextensionsLeftиз ответа. При 0 это навсегда 409extension_limit.temp-mail list-messagesчитает от 1 до 50 писем на страницу, по умолчанию 50, каждое с текстовымsnippetдо 400 символов, в котором часто лежит одноразовый код. Ничего за пределами страницы не теряется, а--allпроходит все страницы.- Чтение письма через
temp read,temp-mail get-messageилиtemp-mail list-attachmentsотмечает его просмотренным. Тело больше 2 МБ обрезается, о чём говоритtruncated, а вложение больше 8 МБ вообще не сохранялось, поэтому егоcontentравен null. - Удаление ящика сразу удаляет его почту, но адрес остаётся зарезервированным до 7 дней после того, как закончилась бы его аренда, и повторный запрос его до этого срока даёт 409
address_taken.
Почта в одноразовом ящике приходит от незнакомцев на адрес, который может назвать кто угодно. Её отправитель никогда не проверяется, и ничто в ней не сканируется, поэтому обращайтесь с её ссылками, HTML и вложениями осторожно.
Любой эндпоинт и пространство имён security
openemail api <method> <path> отправляет один запрос через тот же транспорт, что и любая другая команда, поэтому действуют ваш профиль или ключ, обновление токена, коды подтверждения и подтверждения. Путь сам по себе означает GET, а ответ в JSON выводится отформатированным. openemail api /keys/self это вызов, который стоит за me get.
-d,--dataпринимает тело как встроенный JSON, из файла через@pathили из stdin через-.-q,--queryи-H,--headerпринимаютkey=valueи могут повторяться, а-o,--outсохраняет ответ в файл как есть.DELETEи любой вызов, который команда ресурса попросила бы подтвердить, например отзыв или ротация ключа, сначала просит подтверждения, а без присмотра ему нужен--yes.- Неудачный запрос выводит ошибку API и завершается соответствующим кодом.
Пространство имён security не перечислено в openemail --help, потому что им управляет openemail verify. Его глаголы step-up-status, begin-step-up и verify-step-up это вызовы, которые делает verify: verify --status читает состояние, а verify запрашивает код, просит вас его ввести и проверяет. Они существуют для входа через браузер. С API-ключом каждый отклоняется с 400 step_up_not_applicable, а openemail verify сообщает, что ключу код никогда не нужен.
Примеры
openemail keys create --name 'Billing sender' --scopes emails:send \ --domain-allowlist billing.acme.com --expires-in-minutes 129600 --json \ | jq -r .token | openemail login --with-token --profile billingopenemail whoami --profile billingЗапускайте это с API-ключом, у которого есть keys:manage, например через OPENEMAIL_API_KEY. Секрет идёт из ответа прямо в новый профиль, поэтому никогда не оказывается на экране или в файле. Ключ может отправлять только с billing.acme.com и истекает через 90 дней.
openemail keys list --all | jq -r 'select(.status != "active") | [.name, .status, .lastUsedAt] | @tsv'openemail keys list-workspace-requests --failed-only --since 2026-09-26T00:00:00Z --all \ | jq -r '[.createdAt, .keyName, .status, .errorCode, .method, .path] | @tsv'id=4c1b257a66287fd113bd89d0openemail keys update "$id" --no-enabledopenemail keys list-activity "$id" --since 2026-09-27T00:00:00Z --all | jq -r 'select(.type == "auth_failed") | .createdAt'openemail keys revoke "$id" --reason 'Contractor offboarded' --yesopenemail keys delete "$id" --yesВыключение ключа сначала можно отменить через --enabled. Каждый вызов, который всё ещё предъявляет его, отклоняется и появляется в его активности как auth_failed, что показывает, что от него ещё зависит. Отзыв отменить нельзя, и удалить можно только отозванный ключ.
openemail roles list-permissions --json | jq -r '.[] | [.group, .id, .label] | @tsv'role=$(openemail roles create --name Support --permissions threads:write,emails:send,templates:read \ --description 'Answers help@ and nothing else.' --json | jq -r .id)openemail members add --email [email protected] --role-id "$role" \ --domain-ids 93542ff8-2baa-4f2f-841d-5ceaa074ab0d --access memberopenemail members list-invitationsРоль возвращается ещё и с threads:read и emails:read, потому что названные в ней разрешения их подразумевают. Sam получит роль и весь домен только после того, как примет приглашение. При входе через браузер members add сначала спрашивает код подтверждения.
old=role_8b1f4c2e9a7d3b60e5f1a2c4new=role_2c7e9a1f4b8d3e60c5a7f1b9user=$(openemail members list --all | jq -r 'select(.email == "[email protected]") | .userId')openemail members update "$user" --role-id "$new"openemail roles get "$old" --json | jq '{name, members, apiKeys}'openemail roles delete "$old" --reassign-to "$new" --dry-runopenemail roles delete "$old" --reassign-to "$new" --yesmembers и apiKeys считаются в момент запроса, поэтому показывают, что сдвинет удаление. Пробный запуск выводит DELETE с reassignTo в запросе, не отправляя его. При входе через браузер обновление и удаление каждое спрашивают код подтверждения, поэтому, когда это делает скрипт, сначала запустите openemail verify.
address=$(openemail temp new --ttl 15)openemail send --from [email protected] --to "$address" --subject 'Delivery check' --text 'Your code is 482913' --yesopenemail temp watch "$address" --first --json | jq -r .snippet | grep -oE '[0-9]{6}'openemail temp delete "$address" --yestemp new выводит только адрес, поэтому он помещается в переменную оболочки, а temp watch --first останавливается на первом письме. Укажите этот адрес в форме регистрации вместо openemail send, чтобы так же поймать её код подтверждения.
Scope, подтверждения и ошибки
| Scope | Команды |
|---|---|
| keys:read | keys list, get, list-requests, list-activity, list-workspace-requests, list-workspace-activity |
| keys:manage | keys create, update, delete, rotate, revoke |
| keys:write | me rotate |
| roles:read | roles list, get, list-permissions |
| roles:write | roles create, update, delete |
| members:read | members list, get, list-invitations |
| members:write | members add, update, remove, grant-address, revoke-address, revoke-invitation, resend-invitation |
| Нет, с любым ключом или входом | me get, me ping, languages list |
| Нет, и вход не нужен | temp, temp-mail list-domains и create. Остальные команды temp-mail принимают токен ящика |
- Вход или ключ без нужного scope останавливается с кодом выхода
4, называет недостающий scope и объясняет, как его получить. - Подтверждения просят:
keys delete,rotateиrevoke,me rotate,roles delete,members remove,revoke-addressиrevoke-invitation,temp delete, а такжеtemp-mail deleteиdelete-message. Ответ «нет» завершает их с кодом10и ничего не меняет. Без присмотра и без--yesони останавливаются с кодом выхода2до любой отправки. - При входе через браузер
roles updateиroles delete, а такжеmembers add,update,remove,grant-addressиrevoke-addressещё и спрашивают код подтверждения, если этот вход не подтверждал код в последние 60 минут.--yesникогда его не пропускает, а без присмотра ввести его некому, поэтому команда останавливается с кодом выхода4. Сначала запуститеopenemail verify. У API-ключа код не спрашивают никогда. --dry-runвыводит запрос, который отправило бы изменение, с его телом и завершается с кодом0, не отправляя его и не прося подтверждения.- Список читает одну страницу.
--limitпринимает от 1 до 100, а если его не указать, сервер отдаёт 25, кромеtemp-mail list-messages, которая принимает от 1 до 50 и отдаёт 50.--cursorпринимаетnextCursorпредыдущей страницы.--allчитает все страницы,--max <n>останавливается после стольких элементов, а--ndjsonили--allв конвейере выводит по одному JSON-объекту в строке. С--jsonсписок выводит один документ{ items, hasMore, nextCursor }. roles list-permissions,languages list,temp-mail list-domainsиtemp-mail list-attachmentsвозвращают всё сразу простым массивом, без страниц.- Отказ завершается кодом своего статуса:
3для 401, например у отозванного ключа,4для 403, напримерbeyond_caller_authorityилиowner_only,5для 404,6для 409, напримерnot_revoked,role_in_useилиinvitation_too_soon,7для 400 или 422, напримерmember_is_ownerилиrole_limit_reached, и8для 429, напримерtoo_many_inboxes. - Изменение, которое при повторе сделало бы что-то дважды, никогда не повторяется после сбоя сети:
keys createиrotate,me rotate,roles createиdelete,members add,remove,revoke-addressиresend-invitation, а такжеtemp-mail create,extend,deleteиdelete-message. Проверьте, прежде чем запускать такое снова. Чтения и изменения, которые дважды дают один и тот же результат, такие какkeys update,keys revoke,roles update,members updateиgrant-address, повторяются сами.