ドキュメント本文へスキップ
API

使い捨て受信トレイ

アドレスを持っていない人のための、実際に使えるアドレス。アカウントもキーも不要で、その日のうちに消えます。

使い捨て受信トレイとは何か

呼び出し側は、このインストールが所有するドメイン上のアドレスを要求し、数分間見張り、届いたものを読み、そのまま捨てます。確認コードのため、「このフォームは実際に何を送っているのか」という疑問のため、そして 5 年後も使っているアドレスに結び付けたくないサインアップのためにあります。

  • 受信専用です。送信はありません。受信トレイには送信元にできる識別子がなく、ここにある 9 つの呼び出しのどれもメッセージをワイヤーに乗せません。
  • リース期間の既定は 60 分で、1 時間ずつ最大 24 時間まで延長できます。
  • メッセージは 50 通まで保持し、到着時にカウントされます。満杯の受信トレイに届いたメールはキューに入らず破棄され、1 通削除しても次の 1 通分の空きは生まれません。
  • リースの終了時にメールは削除されます。隠されるのでもアーカイブされるのでもありません。行はその後 1 週間残ります。遅い送信者がまだ再試行している間に、同じアドレスが再発行されないようにするためです。
  • いずれもメールボックスには触れません。使い捨てのメッセージは専用のテーブルに存在し、このパス上のどのクエリも実際のメールボックスには到達できません。

これらは、このサイトの無料ツールが行うのと同じ呼び出しです。ページにできることは、あなたのコードにもできます。API があるのは、ページでは足りない場合のためです。たとえば、実行ごとに新しいアドレスが欲しいテストスイートです。

アドレスは資格情報ではない

使い捨てアドレスは、発行された瞬間にサインアップフォームへ入力されます。そこから To: ヘッダーに乗り、送信側のログを通り、その先にある CRM へと流れていきます。もしアドレスを知っているだけでメールを読めるなら、このツールは発行したすべての受信トレイを、設計上、しかもまさに呼び出し側が距離を置こうとしていた相手に対して漏らすことになります。

そこで、受信トレイの作成は 2 つ目の値を返します。token で、32 バイトのランダム値を oe_inbox_ と 43 文字の base64url で表したものです。このトークンはそのレスポンスにだけ現れ、ほかのどこにも現れません。行には鍵付きハッシュだけが保存されるので、サポートへの問い合わせでもデータベースのダンプでも復元できません。トークンを失うことは受信トレイを失うことであり、他人のメールを読む資格情報としては、それが正しい結末です。

一連の流れ
# 1. Mint one. This is the only response that carries a token.curl -s -X POST "$OE/temp-mail/inboxes" -H "Content-Type: application/json" -d '{}' # 2. Keep it, and read with it.export INBOX="Authorization: Bearer oe_inbox_kQ8v…"curl -s "$OE/temp-mail/inboxes/tinb_9c2f…/messages" -H "$INBOX"

oe_live_oe_test_ の API キーをこれらのルートに送ると、素の 401 ではなく invalid_credential_type として拒否されます。ここでは 2 種類の資格情報が 1 つのホストと 1 つのヘッダーを共有しており、「unauthorised」ではどちらが間違っていたのかを推測させることになります。

リースと、その延長

このジャンルの名前にある 10 分ではなく、1 時間です。10 分は確認コードには足りますが、これらが使われるもう半分の用途には足りません。翌朝もう一度メールを送ってくる試用登録や、最初の試行がタイムアウトして二度記入したフォームです。作成時の ttlMinutes で 1 から 1440 の範囲の別の値を要求できます。その範囲外の値は、黙って調整されるのではなく 422 で拒否されます。要求していない有効期限は、すでに前提にしてしまっている有効期限だからです。

POST /temp-mail/inboxes/{id}/extend は、現在時刻にではなく有効期限に 1 時間を足すので、早めに延長しても残り時間を無駄にしません。延長は 23 回まで可能ですが、受信トレイの作成時点から 24 時間という制限のほうが厳しく効きます。すでにそこまで伸びているリースには、延長回数がいくら残っていても買える時間がありません。すべての受信トレイのレスポンスに含まれる extensionsLeft は両方を数えるので、クライアントはボタンをグレーアウトできます。0 のとき、この呼び出しは 409 extension_limit を返します。

期限切れの受信トレイは、期限が切れた瞬間に認証を受け付けなくなります。そのトークンは、掃除処理を待たずに 404 を返します。メールを削除するのは掃除処理で、1 時間ごとの cron で走ります。DELETE /temp-mail/inboxes/{id} は、同じ削除をその場で行うものです。

各種の上限

これらはいずれもレートリミッターではなく、行を数えるものです。このコードベースに持ち出せるリミッターはなく、ありもしない防御をほのめかすより、そう言うほうが役に立ちます。上限は、被害が出る場所、つまり発行と保存に置かれています。

上限達したときの挙動
リース60 分、最大 24 時間まで延長可能409 conflict_error / extension_limit
受信トレイあたりのメッセージ数50以降のメールは入口で破棄されます。バウンスは書かれず、キューにも入らず、メッセージを削除しても枠は戻りません。
発行される受信トレイ数呼び出し元ごとに 1 時間 6 件、1 日 30 件429 rate_limit_error / too_many_inboxes
保存される本文2 MBメッセージに truncated: true が付き、それ以降は失われます。
添付ファイルのサイズ1 件あたり 8 MBcontent は null になり、メタデータは保持されます。空のファイルとは別物です。

発行の上限は、クライアント IP の鍵付きハッシュに対して数えられ、破棄した受信トレイも数に含まれるので、捨てることで新しい枠を買うことはできません。他人のプロキシの背後では転送ヘッダーを詐称できます。これは資格情報の穴ではなく、この上限の既知の弱点です。ここではその値で何かを認可することはありません。

ここにないもの

未リリース

試して初めて分かるより、あらかじめ伝えるほうがましです。

  • 送信はいかなる形でもできません。使い捨ての受信トレイには送信元にできる接続がなく、それを足せば、匿名で認証のないエンドポイントがオープンリレーになってしまいます。
  • 名前の変更はできません。アドレスを変えるとは、2 つ目の受信トレイを作ることです。その場で名前を変えると、クリックした瞬間に古いローカルパートが解放され、すでに送信中の確認メールが、次にそれを発行された誰かに届いてしまいます。
  • ルール、フィルター、転送、webhook、AI はありません。spam はメッセージ上のフラグに過ぎず、それに基づいて何かが行われることはありません。どこにも振り分けられず、要約も埋め込みも行われません。
  • バウンスはありません。プールされたドメイン宛てで、生きている使い捨て受信トレイにも運用者が作成したアドレスにも当たらないメールは、意図的に黙って破棄されます。公開のアドレス生成器は辞書攻撃を呼び込みますし、攻撃が名乗る return path に配信レポートを書けば、このインストールがバックスキャッターの発生源になってしまいます。
  • ドメインが設定されていなければサービスもありません。TEMP_MAIL_DOMAINS が空のとき、GET /temp-mail/domains は空のリストを返し、受信トレイの作成は 503 temp_mail_unavailable を返します。プールされたドメインへの受信配信は、稼働中のドメインで端から端まで確認されたことがありません。

インストールを運用している場合のドメイン設定

一覧は設定です。TEMP_MAIL_DOMAINS に書かれたものがそのまま配られます。DNS は自動化されていないので、この 5 ステップのうち 4 つはレジストラでの人手の作業です。

  1. そのためのドメインを取得します。見知らぬ人に配ってもよいと思えるドメインを使ってください。そのドメイン上のすべてのアドレスが評判を共有します。ピッカーが新しい受信トレイを最初のドメインから埋めるのではなくプール全体にランダムに散らすのも、そのためです。
  2. アプリの 設定 → ドメイン から追加します。これで送信の識別子が作成され、公開すべき DNS レコードが表示されます。
  3. MX、SPF、DKIM、_openemail-challenge の TXT レコードをレジストラで公開します。検証はライブの DNS を読み、cron で再確認されます。提供されるのは検証済みのドメインだけです。
  4. 検証済みのドメインを、サーバーの TEMP_MAIL_DOMAINS にカンマ区切りで追加します。そこに載るまでは、ワークスペース上の普通のドメインのままです。
  5. catch-all は有効なままにしてください。それがあるからこそ、作成しなくても使い捨てアドレスが存在できます。任意のローカルパート宛てのメールが受け付けられ、通常の宛先検索より前に読み戻されるので、プールされたドメインではアドレスの行が一切書かれません。catch-all を有効にしたままだと、使い捨てのメールが実際のメールボックスに振り分けられ始めます。

予約済みのローカルパート(postmasterabusesecurity ほか RFC 2142 のもの)は使い捨てにできず、代わりに通常のメールボックスへ落ちます。自分宛ての不正利用報告をブラックホールに捨てるプールドメインは、どこにも配信できなくなるドメインです。プールされたドメイン上に自分で作成したアドレス、たとえば legal@privacy@ も同じ挙動です。そこへのメールはあなたのメールボックスに届き、誰かがそれを使い捨てアドレスとして発行されることはありません。

このセクションの内容