使い捨てメールサービスの内側:メールが 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 の仕組みをステップごとに見る