使い捨てメールサービスの内側:メールがSMTPから画面に届くまで

P

PureTempMailチーム

PureTempMailを開発・運営するエンジニアたち

パイプラインを公開する理由

使い捨てメールサービスの多くはブラックボックスです。アドレスを入力するとメールが表示されますが、その間に何が起きているのかは分かりません。誰がメッセージを見られるのか、どこに保存されるのか、本当に削除されるのか。「使い捨てメールサービスは信頼できるのか」という問いへの誠実な答えは、まさにこうした細部にかかっています。そこで私たちは、PureTempMailがどう動いているのかを、コンポーネントごとに正確に記録することにしました。

以下はすべて、今この瞬間にこのサイトを支えている本番システムの説明です。書いたのは、それを作り、運用しているチーム自身であり、簡略化されたマーケティング用の図解ではありません。トレードオフを選んだ箇所では、その内容と理由も述べます。

送信側のメールサーバーがSMTP接続を開始
ハンドシェイクで検査 — 未知または期限切れのアドレスは拒否
受理されたメールはメッセージキューへ
パースと厳格なHTMLサニタイズ
リアルタイムで受信トレイにプッシュ
1通の受信メールがたどる道のり。各段階は本記事で解説しています。

ステップ1:SMTPハンドシェイク — 大半のゴミはここで死ぬ

インターネット上のすべてのメールは、SMTPのやり取りとして始まります。私たちの入り口では、堅牢化したSMTPサーバーがポート25で待ち受けており、対応している送信者にはTLSが有効になります。相手のメールサーバーが接続して宛先を告げても、私たちはメッセージをそのまま受け入れることはしません。

RCPT TOの段階で、つまり本文が1バイトも転送される前に、受信者アドレスを有効なメールボックスの一覧と照合します。そのアドレスを誰も生成していない場合や、メールボックスの期限がすでに切れている場合、接続はその場で恒久的なSMTPエラーとして拒否されます。いったん受け取っておいて黙って捨てる、ということは決してありません。この早い段階での拒否は、意図的な設計上の制約も反映しています。PureTempMailは受信専用であり、PureTempMailのアドレスからメールを送る手段は存在しません。つまり、このサービスをスパムやフィッシング、嫌がらせに悪用することはできないのです。

ステップ2:受信と処理のあいだに置いたキュー

受け入れたメッセージを、SMTPサーバーの中でパースすることはありません。生のメールはメッセージキューへ流し込み、SMTPのやり取りはその時点で終了します。理由はタイミングです。送信側のサーバーは数秒以内の応答を期待しますが、添付ファイル付きの大きなメールをパースするにはもっと時間がかかることがあります。両者を切り離しておけば、受信メールが急増してもタイムアウトやメールの取りこぼしは起きません。キューがピークを吸収し、コンシューマーが順に処理していきます。

そのコンシューマーが生のMIME構造をパースし、件名、送信者、HTML本文とプレーンテキスト本文、添付ファイルを取り出します。添付ファイルは、ランダムに生成した名前で隔離されたストレージに書き込みます。送信者が付けたファイル名をそのまま使うことは決してなく、これによってパス操作という種類の攻撃をまとめて封じています。メッセージのメタデータと本文は、メールボックスの有効期限に紐付けてデータベースに保存します。

ステップ3:HTMLのサニタイズ — マーケティングメールに追跡させない

HTMLメールは、受信トレイの中で最も危険な部分です。典型的なマーケティングメールには、リモート画像(いつどこで開封したかを送信者に伝えるトラッキングピクセル)、外部スタイルシート、ときにはスクリプトまで含まれます。メールを表示する前に、私たちは厳格なホワイトリスト方式のHTMLサニタイザーに通します。スクリプトは取り除かれ、外部リソースは完全に削除され、安全なインラインスタイルだけが残ります。トラッキングピクセルはそもそも読み込まれないため、送信者はメールが開封されたかどうかを知ることができません。

この記事のために作成した模擬マーケティングメール。リモートのメイン画像、プロモーション用の行動喚起ボタン、注釈を付けた隠し1x1トラッキングピクセルが示されている
受信トレイに典型的に届くものを示すために作成した模擬マーケティングメールです。リモート画像、行動喚起ボタン、そして隠された1×1のトラッキングピクセル(ここでは注釈付き)が含まれています。PureTempMailは表示前にリモートコンテンツをすべて取り除くため、このピクセルが読み込まれることはありません。

サニタイズした結果は、ブラウザ内の完全にサンドボックス化されたiframeの中に表示されます。仮に悪意のあるものがサニタイズをすり抜けたとしても、サンドボックスが、周囲のページやメールボックスのセッション、ブラウザ内のその他あらゆるものへのアクセスを遮断します。

ステップ4:Server-Sent Eventsによるリアルタイム配信

多くの使い捨てメールサイトは、ページの再読み込みや数秒ごとのポーリングを強いてきます。PureTempMailは、ブラウザからServer-Sent Events(SSE)による長寿命のHTTP接続を1本だけ張り続けます。コンシューマーがメッセージの保存を終えた瞬間、その接続にイベントが送り出され、メールが受信トレイに現れます。送信者が送ってから、たいてい1〜3秒です。二要素認証のコードや、有効期限の短いアクティベーションリンクのように時間に敏感な場面では、この数秒が効いてきます。

接続は定期的にハートビートを送って切断を検知し、ネットワークが落ちればクライアントが指数バックオフで自動的に再接続します。同じイベントストリームをAndroidアプリとiOSアプリにも使っているため、どのプラットフォームでも新着メッセージは同じ瞬間に表示されます。

ステップ5:期限切れは、本当に削除すること

メールボックスはすべて、画面上で確認できるカウントダウン付きで作られ、有効なうちは延長できます。期限が切れると、数分おきに動くクリーンアップ処理が引き継ぎます。まず添付ファイルをディスクから削除し、次にメールボックスとその全メッセージのデータベース行をカスケードで削除します。

アーカイブも、期限切れメールのバックアップも、データを見えないまま残す「ソフトデリート」のフラグもありません。これは、ポリシーではなくアーキテクチャによって強制されたデータ最小化です。もはや存在しないものは、引き渡すことも、漏らすことも、失うこともできません。

これが道のりのすべてです。SMTPのハンドシェイク、キュー、パーサー、サニタイザー、プッシュイベント、そして削除処理。どの段階も、10分だけ使うアドレスがその後に何の負担も残さないために存在しています。使い捨てメールサービスがメッセージに怪しいことをしていないか気になったら、そのサービスにパイプラインの公開を求めてみてください。私たちは今、それをやりました。

このパイプラインの短い非技術版もご用意しています。 PureTempMailの仕組みをステップごとに見る