mail_filing パイプライン — メール添付自動保存フロー

メール受信 → 添付ファイル取得 → 暫定保存 → 正式フォルダ振り分け

トリガー 毎朝 8:00
🤖
Bot 常駐プロセス(Mac mini)が毎朝8時に自動実行
bot/scheduler.pypython -m mail_filing.pipeline run

実行内容

  • fetch(Phase 1 + Phase 2)→ distribute(Phase 3)を順次実行
  • タイムアウト: 300秒。失敗時は Slack にエラー通知
  • 1日1回のバッチ処理(リアルタイム監視ではない)
1
Phase 1: 全添付ファイル取得 fetch
📡
Microsoft Graph API に問い合わせ
2つのメールボックスを順番にスキャン

メールボックス

対象説明
/me個人メールボックス(yuki.uchiyama@mnml.co.jp)
info@mnml.co.jp共有メールボックス

Graph API クエリ

GET /messages?$filter=hasAttachments eq true AND receivedDateTime ge {90日前}

最大200件取得(ページネーション対応)。各メッセージの添付一覧を追加取得。

フィルタリング(除外条件)

条件除外対象
拡張子.ics .p7m .htm .html .xml .png .jpg .jpeg .gif
ファイル名hennge_secure_download.pdf(暗号化ダウンローダー)
処理済みprocessed.json に記録済みのメッセージ+添付
ファイル重複同名ファイルが保存先に既存

保存先

OneDrive / 20_AI / 00_受領一時 / _全添付 /
  ├── r.nesaki@gmail.com/
  │   ├── 請求書_202603.pdf
  │   └── 作業報告書_202603.pdf
  ├── jleaf415@gmail.com/
  │   ├── 内山様=Curriculum.pdf
  │   └── YUKI-319Sessionslides.pdf
  ├── tanakatax2015@gmail.com/
  │   └── 第2期決算書_20260129.pdf
  └── {送信者メールアドレス}/
      └── {添付ファイル名}
2
Phase 2: URL取得(特定リンクのみ) fetch / catch
🔗
catchルールで件名キーワード検索 → メール本文からURL抽出
添付ファイルは Phase 1 で処理済みのため、ここではURLのみ

処理対象(rules.json の catch ルール)

ルール名検索キーワードURL取得方法
英語コーチング リーフ助殊阿 Playwright(ブラウザDL)→ リネーム
領収書キャッチ 領収書 | receipt | invoice | 請求書 Playwright(ブラウザDL)/ HTTP DL

URLフィルタリング

  • ドメイン制限: invoice.moneyforward.com のみ
  • パス制限: /receipts/ を含むURLのみ
  • HTMLレスポンス(SPA)→ browser_download_selector 指定時のみ対応
3
Phase 3: 正式フォルダへ振り分け distribute
📂
_全添付/ 内の送信者フォルダを走査
rules.json の distribute ルールでファイル名パターンマッチ → 正式フォルダへコピー

振り分けルール例

送信者ファイル名パターンコピー先
r.nesaki@gmail.com 請求書.*\.pdf$ 40_仕入れ請求 / 02_根崎さん
r.nesaki@gmail.com 作業報告書.*\.pdf$ 30_VDU / 20_成果物
support@cloudsign.jp .*(全ファイル) 30_VDU / 10_契約書
fms-tkcmail@tkc.co.jp .*\.pdf$ 40_仕入れ請求 / 01_税理士事務所

振り分け結果

  • ルールあり → 正式フォルダへコピー(元ファイルは _全添付/ に残る)
  • ルールなし → _全添付/ にそのまま残存(ログ出力「未分類」)
  • コピー先にファイル既存 → スキップ(上書きしない)
📢
Slack 通知 #mail-digest

通知タイミング

  • 新着ファイル: Phase 1 + Phase 2 で新規保存されたファイルの一覧を投稿
  • エラー発生時: パイプライン失敗・タイムアウト時に Slack 通知
💬
通知例
📎 新しい添付ファイルを保存しました(3件)
請求書_202603.pdf — r.nesaki@gmail.com「3月分請求書」
Curriculum.pdf — jleaf415@gmail.com「English Session Slides」

パイプライン概要

実行頻度
毎朝 8:00
スキャン範囲
過去 90日分
メールボックス
2箱
冪等性
processed.json