レシピ · 7手 · 1プロンプト実装

過去メールから重要関係者を取り込む(Gmail 全走査・閉域ローカル)

過去のメール(Google Takeout の mbox)を全期間遡って走査し、実際に往復のある重要関係者だけを透明なルールで抽出 → 人手承認 → 承認分だけを暗号化取込。走査ツールと DB は commit / deploy しない閉域ローカル運用にし、ツール自体は一切メールを送らない。本文は保存せず案件語の一致数だけを数える

前提: run-newsletter-ops前提: collect-web-leads解説 ch.31解説 ch.33module: マッチング & ディレクトリmodule: リード獲得

フォーム経由の問い合わせ(add-leads)や Web 収集(collect-web-leads)では拾えない 「メールで直接やり取りした既存の重要関係者」 を、過去メールの全走査で取り込む。 collect-web-leads の姉妹ツールで、 閉域ローカル専用送信機能なし本文を保存しないという非交渉条件は同じ。承認分だけを run-newsletter-ops の取込器へ渡す。

0. 非交渉条件

特定電子メール法では、取引・やり取りの過程で相手が通知した営業用アドレスへの送信は一定条件下でオプトイン例外。 その趣旨に沿い、走査器に以下を機械的に強制する(変更禁止):

条件実装
送信経路なし走査器にメール送信コードを持たせない。送信は別系統・人手承認後のみ
本文を保存しない本文は先頭数KBだけ案件語の一致数を数えて破棄。DB に本文を書かない
自分との実在の関係のみ「自分が返信した」「往復がある」を軸に採点。片道の受信だけは低優先
機械送信を除外no-reply / mailer-daemon、メルマガ(List-Unsubscribe / Precedence: bulk)、自動送信(Auto-Submitted)はハード除外
出所の記録連絡先ごとに往復サマリ(受信/送信数・最終日)を source として保存
閉域DB は _prospect/data/mailbox.db/_prospect/ は gitignore。commit / deploy しない

1. 閉域ディレクトリ(collect-web-leads と同居)

_prospect/ を再利用する(未作成なら collect-web-leads の手順1)。 保存は Node 22.5+ 内蔵の node:sqlite、実行は node --experimental-sqlite。web 収集の DB とは 別ファイル mailbox.db に書く(スキーマ層 lib/db.mjs は共有し、openDb(path) の引数で切替)。

2. mbox を入手(Google Takeout)

対象アカウントで takeout.google.comメールのみ選択 → 「すべての mbox データ」→ エクスポート → 解凍して .mbox を用意。 全期間・全件が確実に取れる唯一の経路(API の OAuth 設定が要らない)。

3. 全走査

scan-mailbox.mjs を実行(--me は自分のアドレス。エイリアスは繰り返し、社内ドメインは --me-domain):

node --experimental-sqlite _prospect/scan-mailbox.mjs \
  --me you@your.co --me-domain your.co "All mail Including Spam and Trash.mbox"

mbox を ストリームで1通ずつパースし、ヘッダから差出人/宛先/日付/件名を取り出す (MIME encoded-word はデコード)。方向(自分発 / 相手発)を判定し、相手アドレスごとに 送信数・受信数・最終日・案件語ヒットを集計 → スコア → mailbox.db の企業/メール表に upsert。 まず --dry で件数と上位だけ確認できる。

4. 判定ルール(ニーズ精査の真実源)

config.jsonmailboxKeywords(案件語辞書)と mailboxScoring(重み)だけを編集して調整する (ハードコード禁止)。スコアは透明な加算 → 0〜100 にクランプ:

強度は --strict(往復2回以上 or 案件語つき往復)/ 既定=標準(法人=受信実績あり / フリーメール=受信かつ案件語)/ --broad(片道でも双方向実績があれば)。閾値で自動却下はせず、最終判断は人が下す

5. 承認(localhost 専用 UI)

review.mjsmailbox モードで起動(web 収集の 4599 とは別ポート 4600・127.0.0.1 のみ):

node --experimental-sqlite _prospect/review.mjs --db mailbox   # → http://127.0.0.1:4600

スコア降順に、会社(ドメイン)/ 相手アドレス+人名 / シグナル / 往復サマリを見て 承認 / 却下。 非ループバックは 403。localhost 専用なので外部に露出しない。

6. 書き出す → 取込器へ

node --experimental-sqlite _prospect/export-approved.mjs --db mailbox
# → _prospect/data/mailbox-export.csv (email,name,source_url) ※人名つき・往復サマリを出所に
node scripts/import-inquiries.mjs _prospect/data/mailbox-export.csv --source email --apply

取込器側で PII は AES-256-GCM 暗号化、source=email / 同意根拠 prior_correspondence で記録され、 以後は unsubscribe / suppression の管轄下に入る。

7. 送信は別工程

連絡先化しても、送信は必ず run-newsletter-ops のキャンペーン作成を経る。 初回は既存取引の文脈を明記し、cold ではなく既知の関係者として、送信者表示+配信解除リンクを必須にする。

検証(acid test)

1本作り、scan-mailbox.mjs --dryメルマガ・no-reply が除外され、往復のある法人が高スコア、 私信フリーメールが除外されることを確認。

PII をマスク表示。git check-ignore _prospect/ が効き git status に一切現れないこと。