認証
ブラウザまたは API キーでサインインし、複数のプロファイルを使い分け、重要な変更の前にコードを確認します。
2 つのサインイン方法
ターミナルで openemail login を実行すると、どちらを使うか尋ねられます。どちらの場合もサインインはプロファイルとして保存され、以降のコマンドはアクティブなプロファイルを使います。
| コマンド | 誰として動作するか | 確認コード |
|---|---|---|
| openemail login | あなた。承認したワークスペースとアクセス権の範囲で | いくつかの重要な変更の前に求められます |
| openemail login --with-token | ワークスペース。キーが持つスコープで | 求められません |
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 でそのページが開きます。
内部では MCP サーバーと同じ OAuth フローを使います。PKCE を使う公開クライアント、使い捨てのコード、1 時間有効で自動的に更新されるアクセストークンです。ブラウザはランダムなポートの 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)で、スクリプトに必要なスコープだけを持つキーを作成してください。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 を勧めます。キーを保存せずに使う方法は 2 つあります:
- 環境変数の
OPENEMAIL_API_KEYは、それが見えるすべてのコマンドで、保存済みのどのプロファイルよりも優先して使われます。 --api-key <key>はそのコマンド 1 回だけに使われます。
認証情報が複数ある場合は、次のうち最初のものが使われます:--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 otherOPENEMAIL_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、Web アプリ、サインイン、トークン、取り消しのリクエスト、そして MCP サーバーです。それ以外にはhttpsを使ってください。 openemail api //example.com/xのように API のオリジンの外に出てしまうリクエストパスは、何も送らないうちに終了コード2とinvalid_pathで止まります。
それぞれのサインインでできないこと
ブラウザでのサインインはあなたとして動作しますが、どのアクセス権を選んでもアプリには決して承認されないものがあります:
- API キーの管理。
keys:writeとkeys:manageは決して付与されないため、キーの作成、ローテーション、取り消しにはkeys:manageを持つ API キーか Web アプリが必要です。openemail me rotateは呼び出しに使っているキーをローテーションするので、API キーが必要です。 - 請求とワークスペースそのもの。プラン、請求書、ワークスペースの作成、切り替え、削除は Web アプリで行います。
- 無料アドレス。アプリはビジネスワークスペースに対して承認され、無料アドレスを持つ個人ワークスペースは選択肢に出ません。API と同じルールです。
- メンバーとロール。承認がワークスペース全体を対象にしていない限り使えません。一部のドメインやアドレスに限定した承認からは
members:writeとroles:writeが外されます。
API キーにも独自の制限があります。ai compose、ai summarize、そして config 以外のすべての openemail mcp コマンドは、ブラウザでのサインインが必要な MCP サーバーを経由するため、キーでは終了コード 4 で停止し、理由を表示します。
確認コード
ブラウザでサインインしている場合、いくつかの変更は Web アプリと同じように、まず確認コードを求めます。CLI は必要なときに尋ねます。6 桁のコードをメールで送るか、2 段階サインインが有効な場合は認証アプリのコードかバックアップコードを求めます。コードが正しければコマンドが実行され、そのサインインは 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と入力すると、メールがもう一度送られます。間違ったコードでは、残りの試行回数が表示されます。 - コードが受け付けられると、コマンドはもう一度だけ実行されます。2 回実行されることはありません。
--yesは削除を確認しますが、コードを省略することはありません。- 無人実行(
--jsonや--no-input、CI、ターミナルなし)ではコードを入力できる人がいないため、コマンドは終了コード4で停止し、何も変更しません。 - コードは 5 回まで試せ、5 回誤ると CLI が新しいコードを提案します。各サインインは 1 時間に 5 個、1 日に 20 個までコードを求められます。
- 1 つのサインインで 24 時間以内に 10 回誤ったコードを入れると、その確認は一時停止されます。CLI はいつ再開するかを示し、別のコードを提案せずに終了コード
4とstep_up_pausedで止まります。それを説明するメールにはアプリ名が記されます。
スクリプトや AI クライアントが重要な操作を行う前に openemail verify を実行してください。今すぐコードを求め、以後 60 分間はそのプロファイルのすべてのコマンドがコードなしで実行されます。openemail mcp call とローカルの MCP ブリッジも含みます。
openemail verifyopenemail verify --statusopenemail verify --status --jsonopenemail verify --forceこの 60 分は 1 つのサインインに属します。別のプロファイルや、独自にサインインした AI クライアントは、それぞれのコードを求められます。サインアウトするとすぐに終了します。--force は新しいコードを求め、新たに 60 分を開始します。
有効期限、サインアウト、取り消し
- ブラウザでのサインインのアクセストークンは 1 時間有効です。CLI は期限切れの前に更新して新しいものを保存するので、気付くことはありません。
- 各リフレッシュトークンは 1 回しか使えません。CLI が置き換えてから 30 秒を超えて古いトークンが使われると、たとえば別のマシンにコピーした
config.jsonから使われると、サーバーはそのサインインを完全に取り消します。ファイルをコピーせず、マシンごとにサインインしてください。 - 承認は、承認ページで選んだ期間だけ有効です。期限が切れるか、アカウント → 接続済みアプリでアプリが削除されると、CLI はあなたとして動作できなくなり、もう一度
openemail loginを実行するよう求めます。 openemail logoutはブラウザでのサインインをサーバー側で取り消して接続済みアプリから削除し、その後このデバイスから消去します。サーバーに接続できなくても消去します。--allはすべてのプロファイルからサインアウトします。- API キーからのサインアウトは、ここで忘れるだけです。キーは
openemail keys revoke <id>か Web アプリで取り消すまで使えます。
サインインの保存場所
すべて ~/.openemail、または OPENEMAIL_CONFIG_DIR が指すフォルダーに保存されます。フォルダーはあなただけが読め(0700)、中のファイルもすべて同様です(0600)。各ファイルは一時ファイルに書き込んでから名前を変えて置き換えるので、クラッシュしても中途半端なファイルが残ることはありません。また、すべての変更はロックファイルの下で行われるため、並行して動くコマンドがプロファイルを失うことはありません。
| ファイル | 内容 |
|---|---|
| config.json | プロファイル:API キー、アクセストークンとリフレッシュトークン、どのプロファイルがアクティブか |
| temp-mail.json | この CLI が作成した使い捨て受信トレイと、その受信トレイトークン |
| update-check.json | 最後に npm に新しいリリースを問い合わせた日時と、その応答 |
トークンとキーは、あなたのユーザーだけが読めるファイルにプレーンテキストで保存されるため、フォルダーは SSH キーと同じように扱ってください。CLI が解釈できないファイルが、黙ってサインアウト扱いされることはありません。パスを示して一度だけ警告し、新しいファイルを書く前にその隣にコピー(config.json.bak)を残します。権限などの理由でまったく読めないファイルは、そのファイル名を示すエラーでコマンドを止めます。