ここ2週間ほどで、各種企業や店舗からの個人情報流出の報道が急増しています。自分の個人情報は自分で守らなければならない時代、不要なサービスは先手で退会し、少しでも流出を防止できるように努めなければなりません。
しかし、登録するだけしておいて放置していたアカウントがなんとも多い…。企業に自分の個人情報を預けておくこと自体がリスクなのは頭では理解していたのですが、ズボラな私は過去10年以上、不要になったサービスもほとんど退会せずに放置していました。
そこで、手っ取り早く過去のメール(gmail)から会員登録メールを抽出し、アカウント登録していると思われるサービスを把握して、片っ端から不要なサービスを退会していくという作業を進めています。今回はその時の記録です。
解決策
一番簡単なのは gmail などメーラーの検索欄で「会員登録」などと検索することですが、これでは宣伝メールや同サービスからの重複したメールまでもがヒットしてしまいます。
そこで、同じアドレスからのメールを重複排除をしつつ、「これは会員登録メールである」と推定したうえで提示してくれるスキャナースクリプトを Python で作成しました。…いえ、Codex に作ってもらいました。
No description available
ここに mbox ファイルをぶち込むとこんな Excel シート(または csv ファイル)を出力してくれます。

判定ロジック
mbox ファイルからメールを抽出し、メールの文章から一通ずつ分類していきます。例えばこんな感じ。
| 分類 | 例 |
|---|---|
| 登録完了 | 「会員登録完了」「アカウントを作成しました」など |
| 認証依頼 | 「メールアドレスの確認」「verify your email」など |
| 利用通知 | 「ログイン通知」「パスワードを変更しました」など |
| 退会申請 | 「削除申請を受付」「deletion request received」など |
| 退会完了 | 「退会完了」「your account has been deleted」など |
| その他 | 「welcome」「会員限定」「請求書」など |
このうち「登録完了」に分類されたメールを「登録メール」として検知します。なお、「退会完了」とみなされたサービスについては、退会済としてリストには追加しません。なお、登録完了に分類されうるメールの中でも、「方法」「予定」「完了していません」などの表現や、返信・転送を検知した場合は分類の根拠として扱いません。
「推定状態」はこんな感じで決定しています。
| 推定状態 | 判定条件 |
|---|---|
| 登録候補 | 初期状態。認証依頼、利用通知、請求、ログイン通知などだけがある |
| 登録の証拠あり・現状未確認 | 登録完了と分類されたメールがある |
| 退会申請中 | 退会関連の証拠あり。日時を比較した上で最新が退会申請の場合。 |
| 退会完了の証拠あり | 1. 件名から退会完了と分類される 2. 登録・認証・利用・退会に関するメールを時系列で並べた時、最新が退会完了 3. 同じ最新日時に別の種類(登録・利用など)のメールがない 4. 日付不明の重要なメールが存在しない |
| 要確認 | 退会関連の証拠はあるが、完了・申請中と整理できない |
上記に従うと、登録→退会完了なら除外候補になり、一方で登録→退会完了→再登録なら「要確認」になります。
使い方
Gmail のメールのエクスポートには、 Google Takeout を使います。Google Takeout は Google アカウントが持つデータをダウンロード可能な形にエクスポートしてくれるサービスです。Gmail の場合、 .mbox 形式でダウンロードできますので、この形式で落としておきましょう。
まずは「追加するデータの選択」で一旦全チェックを外し、

「メール」だけ選択します。メールの形式は MBOX で。


次に画面一番下の「次のステップ」をクリックすると、エクスポート先の設定と頻度などが出てきます。ここは既定のままで OK です。「エクスポートを作成」をクリックします。

しばらく待つと、エクスポートされた mbox 形式のファイルがダウンロード可能になります。ちなみにこのエクスポートには結構時間がかかります。私の環境では、過去13年分のメールで 2.14GB、生成に4時間程かかりました。
完了するとこんな感じの通知メールが来ます。

mbox ファイルをダウンロードし、mbox-registration-scanner に渡すと先程提示したようなアカウント登録台帳表が出力されます。
(.venv) PS C:\Users\ytani\git\gmail-registration-scanner> python scanner.py --mbox .\takeout.mbox --xlsx
500 通処理 / 候補 39 通
1,000 通処理 / 候補 88 通
1,500 通処理 / 候補 209 通
2,000 通処理 / 候補 448 通
2,500 通処理 / 候補 652 通
3,000 通処理 / 候補 852 通
3,500 通処理 / 候補 1,001 通
4,000 通処理 / 候補 1,192 通
4,500 通処理 / 候補 1,393 通
5,000 通処理 / 候補 1,571 通
5,500 通処理 / 候補 1,701 通
6,000 通処理 / 候補 1,811 通
6,500 通処理 / 候補 1,871 通
7,000 通処理 / 候補 1,928 通
7,500 通処理 / 候補 2,050 通
8,000 通処理 / 候補 2,299 通
8,500 通処理 / 候補 2,337 通
9,000 通処理 / 候補 2,388 通
...
あとは出てきた表を見て、不要なアカウントを見つけ次第退会するだけ!(ここが一番大変…)
おわりに
最終的には500件ほどのアカウント登録情報が抽出されました。中にはダブっているものもあるのですが、13年間放置しているとここまで膨れ上がるとは…。不要なアカウントはこまめに削除するよう心がけないといけませんね。