ドメインとアドレス
ドメインを追加して検証し、必要な DNS レコードを読み、そのアドレスを管理し、どのアドレスとして送信できるかを確認します。
概要
ドメインは 2 つの名前空間で扱います。openemail domains はワークスペースに接続されたドメインを管理します。追加と削除、各ドメインに必要な DNS レコード、受信と送信ができるかどうか、キャッチオール、トラッキング用とファイル用のドメイン、そのドメインのアドレスです。openemail addresses はもっと限られた問いに答えます。使っているキーやサインインが、どのアドレスとして送信できるかです。
- ドメインのコマンドはドメイン ID を受け取ります。これは
domains listやdomains createから得られる UUID です。代わりにホスト名を渡すことはできないので、openemail domains get acme.comは 404 になり、終了コード5で終了します。 - アドレスのコマンドは、ドメイン ID の次にアドレス ID を受け取ります。アドレス ID は
domains list-addressesやdomains create-addressから得られる UUID です。 domainとaddressも名前空間の名前として使えます。ドメインの動詞はls、show、new、edit、rmなどのいつもの別名で使え、addresses listも同様です。create-addressなど、ドメイン上のアドレスを扱う 5 つの動詞には別名がありません。openemail <command> --helpは、すべての引数とフラグを、その型、呼び出しに必要なスコープ、メソッドとパス、返ってくるものとともに一覧表示します。--jsonを付けると、同じページをデータとして出力します。
すべてのコマンド
| コマンド | 機能 |
|---|---|
| openemail domains list | ワークスペースのドメインをアルファベット順に、受信、送信、トラッキング、ファイルの状態とともに一覧表示します |
| openemail domains get <id> | 1 つのドメインを、そのアドレス、使用するすべての DNS レコードと各レコードが見つかったかどうか、DMARC の読み取り結果とともに読みます |
| openemail domains create --domain <value> | ドメインを追加します。応答には公開すべきすべての DNS レコードが含まれ、すでに 1 回確認済みです |
| openemail domains verify <id> | ドメインの DNS をすぐに確認し、確認後の状態のドメインを返します |
| openemail domains update <id> | キャッチオールをオンまたはオフにし、トラッキング用ドメインとファイル用ドメインを設定または削除します |
| openemail domains delete <id> | ドメインとそのすべてのアドレスを削除します。確認を求めます |
| openemail domains list-addresses <id> | ドメインのアドレスを、ID、ラベル、有効状態、最後にメールを受信した日時とともに一覧表示します |
| openemail domains create-address <id> --local-part <value> | ドメインに有効なアドレスを作成します。--label は任意です |
| openemail domains get-address <id> <address-id> | ドメインのアドレスを 1 つ読みます |
| openemail domains update-address <id> <address-id> | --label でアドレスの名前を変更するか、--no-enabled と --enabled でオフとオンを切り替えます |
| openemail domains delete-address <id> <address-id> | アドレスをそのドメインから削除します。確認を求めます |
| openemail addresses list | このキーまたはサインインで送信元として使えるアドレスと、各ドメインの受信と送信の状態を一覧表示します |
すべてのフラグは各コマンドのヘルプにあります。たとえば openemail domains update --help や openemail domains create-address --help です。
受信と送信
ドメインは互いに独立した 2 つの事実を報告します。receiving.verified は、公開 DNS がそのドメインの MX レコードと _openemail-challenge TXT レコードを返すようになると true になり、それ以降メールを受信します。sending.status は、最後の確認で見た署名の状態で、verified、pending、failed、no_identity、unknown のいずれかです。sending.canSend は、今そのドメインからの送信が受け付けられるかどうかを示し、1 日より古い否定的な判定は不明として扱われます。そのためスクリプトは status ではなく canSend で分岐してください。false の間、そのドメインからの送信は 409 domain_not_sendable で拒否されます。
domains createは呼び出しの中で最初の DNS 確認を行うので、recordsの各エントリにはすでにstatusがあります。found、missing、またはまだ確認されていなければ null です。値はそのドメイン固有なので、すべてのレコードを示されたとおりに正確に公開してください。domains verifyはすぐに確認します。前回の確認から 10 秒以内なら新たな確認は行わず、現在の状態のドメインを返します。検証済みのドメインでは署名レコードを再確認するので、sendingは最新になります。- 未検証のドメインに対する
domains getは、前回の確認から 20 秒以上たっていれば再確認します。そのためgetのポーリングでも使え、verifyにはdomains:writeが必要なのに対し、こちらはdomains:readだけで済みます。 - 公開したばかりのレコードが公開 DNS に現れるまで数分かかることがあります。
ターミナルでは、get、create、verify は 1 行に 1 フィールドを出力し、receiving、sending、records などの入れ子のブロックはコンパクトな JSON で表示します。下の例のように、--json を付けて jq などのツールで読んでください。
キャッチオール、トラッキング用ドメイン、ファイル用ドメイン
domains update は互いに依存しない 3 つの設定を変更します。省略したフラグの設定はそのまま残り、フラグを 1 つも付けなければドメインは変更されずに返ります。
| フラグ | 変更する内容 |
|---|---|
| --catch-all, --no-catch-all | オンにすると、誰も作成していないアドレス宛てのメールもそのドメインで受け付け、そのアドレスは最初のメッセージから list-addresses に表示されます。オフにすると、手動で作成していないすべてのアドレス宛てのメールを拒否します。以前キャッチオールが拾ったアドレスも含みます。新しいドメインはオンの状態で始まります |
| --tracking-host <value> | 追跡リンクと開封ピクセルに使う links.acme.com のようなサブドメインです。null で削除します |
| --storage-host <value> | そのドメインから送られたファイルのダウンロードリンクに使う files.acme.com のようなサブドメインです。null で削除します |
- 新しいホストは同じ呼び出しの中で保存され、確認されます。応答の
trackingまたはstorageブロックにあるrecord.nameという名前とrecord.valueという値で CNAME レコードを公開し、プロキシはすべてオフにしてください。ホストを設定し直すと値が変わることがあるので、最新の応答が示す値を公開してください。 - 確認に合格するまで、ホストは
pendingと表示され、新しいメールは既定の OpenEmail のホストを使い続けます。合格するとactiveになります。OpenEmail は自動で確認を続け、有効なホストが 3 回続けて確認に失敗するか、最後に合格した確認から 2 時間たつとfailedになり、新しいメールは既定のホストに戻ります。 - ホストは
--tracking-host nullのようにnullで削除します。--tracking-host=のような空の値は CLI では使い方のエラーとなり、終了コード2で終了します。 - 新しいホストには、ドメインが検証済みであるか、少なくとも
_openemail-challengeTXT レコードが公開されている必要があります。そうでなければ呼び出しは 409domain_not_verifiedで拒否されます。 - フラグは、キャッチオール、トラッキング用ドメイン、ファイル用ドメインの順に適用されます。後のフラグが拒否されても前の変更は保存されたままになることがあるので、それぞれを独立させたい場合は別々の呼び出しで送ってください。
ドメインのアドレス
ドメインには、手動または API で作成されたアドレスと、最初にメールが届いたときにキャッチオールが拾ったアドレスがあります。list-addresses は無効なものも含めて両方を表示します。キャッチオール自体は行ではなく、ドメインの receiving.catchAll です。
create-addressは、@ の前の部分である--local-partと、任意の--labelを受け取ります。ドメインはまだ検証されていなくてもかまいませんが、検証されるまでアドレスは何も受信しません。*だけのものは、キャッチオールの書き方なので拒否されます。- すでに存在するアドレスや削除されたアドレスを作成してもエラーにはなりません。送ったラベル付き、またはラベルなしで有効な状態で戻り、ID もそのままです。キャッチオールが拾ったアドレスは手動で作成したものになるので、キャッチオールをオフにした後も受信を続けます。
- キャッチオールがオンのとき、新しいアドレスは、プライバシー設定を除き、署名やトラッキングなどキャッチオールのアドレスごとの設定を引き継いで始まります。設定は 1 回コピーされるだけで、その後は同期されません。
update-address --no-enabledはアドレスがメールを受け取るのを止めるので、送信者にはバウンスが返り、そのアドレスからは何も送信できません。メール、設定、アクセスできる人はそのまま残り、--enabledで中断したところから再開します。--labelで名前を変更し、--label nullで名前を削除します。delete-addressはさらに踏み込みます。キャッチオールがオンでもそのアドレス宛てのメールは拒否され、転送は止まり、設定は削除され、アクセス権を与えられていた人はそれを失い、パスワードでのサインインは取り消されます。すでに受信したメールはメールボックスに残ります。もう一度作成すると同じ ID が戻りますが、以前の設定やアクセス権は戻りません。
送信元として使えるアドレス
openemail addresses list は、403 from_address_forbidden の背後にある問い、つまり呼び出しに使っているキーやサインインがどのアドレスを From に入れられるかに答えます。送信が何を受け付けるかを示すものなので、読み取りのスコープではなく emails:send が必要です。
- ターミナルでは 2 つの表を出力します。まずアドレスで、それぞれが有効かどうかと送信に使えるかどうか、次にドメインで、それぞれ受信と送信について検証済みかどうかと、キャッチオールです。
unrestrictedは、認証情報が何にも制限されていないときに true になります。その場合、ワークスペースのドメインのどのローカルパートからでも送信でき、誰も作成していないものも含みます。それ以外の場合、canSendが true になるのは、認証情報が持つドメイン全体または自身のアドレスのリストを通じて対象になっている、有効なアドレスだけです。- 無効なアドレス、認証情報の対象外のアドレス、ドメインがまだ署名できないアドレスでは、
canSendは false です。 - 一覧に表示されるのは作成済みのアドレスだけです。ドメイン全体を持つ認証情報は、そのドメインの任意のローカルパートとして送信できます。また、リストにあってもメールボックスのないアドレスは、ここに表示されなくても送信元として使えます。
--jsonを付けると、他のリストが出力する{ items, hasMore, nextCursor }ドキュメントではなく、1 ページなら{ unrestricted, addresses, domains, hasMore, nextCursor }を、--allなら{ unrestricted, addresses, domains }を出力します。パイプで--allを使うか--ndjsonを付けると、1 行に 1 つのアドレスを出力します。
status、open、DNS プロバイダー
openemail status は、サインイン、addresses list、domains list を同時に読み、まとめて出力します。Sender addresses の表には、各アドレスが送信できるかどうかと有効かどうかが表示されます。Domains の表には、各ドメインの受信についての verified または not verified、送信のステータス、キャッチオールが表示されます。それぞれ最初の 100 件を表示し、残りを見るための --all 付きのコマンドを示します。
domains:readがない場合のドメインや、emails:sendがない場合のアドレスのように、認証情報で読めない部分には理由とともに Not available と表示され、残りはそのまま出力されます。- まだアドレスがない場合は、
openemail domains create --domain example.comを提案します。 openemail status --jsonは、account、addresses、domains、unavailableを持つ 1 つのオブジェクトを出力します。unavailableには、読めなかった各部分の理由が入ります。
新しいドメインのレコードを自動で書き込むための DNS プロバイダーの連携は、0.0.2 では Web アプリでしか行えません。openemail open providers または open dns でそのページが開きます。open domains はドメインとその DNS レコードを、open addresses はアドレスを開きます。転送も Web アプリにあり、open forwarding <address> で 1 つのアドレスの転送設定を開きます。--print を付けると、ブラウザを開く代わりにリンクを表示します。
OpenEmail がドメインの DNS を自分で書き込んだ場合、domains delete はそれらのレコードを取り消し、取り消せなかったものを leftBehind に一覧表示します。それらは DNS プロバイダーで削除してください。自分で公開したレコードには一切触れないので、ドメインを削除したらそれらも削除してください。
例
openemail domains create --domain acme.com --json > acme.jsonjq -r '.records[] | [.type, .name, .value, (.priority // "")] | @tsv' acme.jsonopenemail domains verify "$(jq -r .id acme.json)"id=b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6funtil openemail domains get "$id" --json | jq -e .receiving.verified > /dev/null; do sleep 30doneopenemail domains get "$id" --json | jq '.sending | {status, canSend, error}'openemail domains list-addresses "$id" --allopenemail domains create-address "$id" --local-part invoices --label Invoicesopenemail domains update "$id" --no-catch-all --dry-runopenemail domains update "$id" --no-catch-allinvoices を手動で作成しておくと、キャッチオールをオフにした後も受信を続け、キャッチオールが拾った他のすべてのアドレス宛てのメールは拒否されます。ドライランは PATCH とその本文を送らずに表示します。
openemail domains update "$id" --tracking-host links.acme.com --json | jq '.tracking | {status, record, error}'openemail domains update "$id" --tracking-host nulladdress_id=$(openemail domains list-addresses "$id" --all | jq -r 'select(.address == "[email protected]") | .id')openemail domains update-address "$id" "$address_id" --no-enabledopenemail domains delete-address "$id" "$address_id" --yes先にアドレスをオフにする操作は --enabled で元に戻せます。削除は元に戻せず、スクリプトでは --yes が必要です。ブラウザでサインインしている場合は確認コードも求められ、--yes でそれを省略することはできません。
openemail domains list --all | jq -r 'select(.sending.canSend | not) | [.domain, .sending.status] | @tsv'openemail addresses list --all --json | jq -r '.addresses[] | select(.canSend) | .address'スコープ、確認、エラー
| スコープ | コマンド |
|---|---|
| domains:read | domains list、get、list-addresses、get-address |
| domains:write | domains create、verify、update、delete、create-address、update-address、delete-address |
| emails:send | addresses list |
- スコープのないサインインやキーは終了コード
4で停止し、足りないスコープの名前と取得方法を示します。 domains deleteとdomains delete-addressは確認を求めます。いいえと答えると終了コード10で終了し、何も変更しません。--yesなしの無人実行では、何も送らないうちに終了コード2で停止します。- ブラウザでサインインしている場合、この 2 つの削除は Web アプリと同じように確認コードも求めます。無人実行では誰も入力できないので、コマンドは終了コード
4で停止します。先にopenemail verifyを実行すれば、その後 60 分間はコードが不要です。API キーが求められることはありません。 --dry-runは変更が送るはずのリクエストを本文とともに表示し、送信も確認もせずに終了コード0で終了します。- リストは 1 ページを読みます。
--limitは 1 から 100 を受け付け、省略するとサーバーは 25 件を返します。--cursorは前のページのnextCursorを受け取ります。--allはすべてのページを読み、--max <n>はその件数で停止し、--ndjson、またはパイプでの--allは 1 行に 1 つの JSON オブジェクトを出力します。--jsonを付けると、domains listとlist-addressesは 1 つの{ items, hasMore, nextCursor }ドキュメントを出力します。 - 特定のドメインやアドレスに限定されたキーやサインインでも、すべてのドメインとアドレスが見えます。ドメインを追加することはできず、それ以外の変更には対象のドメイン全体を持っている必要があり、そうでなければ呼び出しは 422
capability_unsupportedで拒否されます。 - 拒否された場合は、そのステータスに対応するコードで終了します。403 なら
4で、プランでこれ以上ドメインを追加できないときのdomain_allowance_reachedなどです。404 なら5、409 なら6で、domain_already_addedやdomain_claimedなどです。422 なら7で、invalid_tracking_hostやworkspace_limit_reachedなどです。 - ワークスペースの最後のドメインは CLI から削除できません。それは 409
last_domainになります。削除するとメールボックス全体が消えるため、Web アプリで先に確認するからです。予約済みのアカウントアドレスを持つドメインは 409domain_holds_reserved_addressesになります。 domains createと 2 つの削除は、ネットワーク障害の後に再試行されることはありません。応答が失われた後の自分での 2 回目の試行で 409domain_already_addedや 404 が返った場合は、1 回目が成功したということです。verify、update、create-address、update-addressは 2 回送っても結果が同じなので、自動で再試行されます。