技術解説 Milter × Nextcloud ストリーミング配布 非同期ワーカー

技術アーキテクチャ
添付“リンク化”の内側

ZipCloudMilter は Postfix の Milter 連携で添付をクラウドへ退避し、本文を安全なダウンロードリンクへ置換します。
ここでは構成・データフロー・セキュリティ設計・非同期ワーカー・障害時の挙動をまとめます。

1. 全体構成図(論理)

2. データフロー(送信時)

  1. MUA から Postfix(submission/smtp)へ送信。
  2. 前段で Rspamd/ClamAV による拒否・隔離判定。
  3. 通過したメールを ZipCloudMilter に引き渡し、添付を抽出。
  4. Nextcloud にアップロード(フォルダ/権限/クォータ確認)。
  5. 本文を 配布リンク+案内文に置換(#LIMIT/#EXPIRE/#ZIP/#REPLY を反映)。
  6. 送出。必要に応じて 送信者へ初回DL通知の準備や公開停止URLを発行。
送信側の手順は基本不要。件名コマンドで案件ごとの上書きのみ。

3. データフロー(受信時)

  1. 受信者は本文の「ダウンロード開始」をクリック。
  2. 必要に応じて別送パスワードを入力。
  3. ストリーミング配布でダウンロード(ワンタイム/回数上限に追従)。
  4. 初回ダウンロード時、送信者へ 初回DL通知
  5. 誤送信時は、送信者の公開停止リンクから即時無効化可能。
相手先ポリシーにより cloud / zip / reply へ自動切替(ドメイン別ポリシー)。

4. シーケンス(簡易時系列)

5. 非同期ワーカー(キュー&ファンアウト)

役割

  • /var/tmp/zipcloudmilter/queue のジョブ(.json + .eml)を監視・処理
  • Nextcloud へアップロード&共有情報取得(同期と同等)
  • 受信者別トークンを生成・保存し、sendmailで個別に通知(Bcc漏れ回避)
  • ワンタイム/回数/期限・返信リンク(#REPLY)・公開停止URLに対応
  • 処理ログは /var/log/zipcloudmilter_async.log

投入条件(代表例)

  • 受信者が複数でストリーミング配布(またはワンタイム)
  • 大容量メール(例:100MB超)
  • 運用ポリシーにより明示的にオフロード
件名の #LIMIT / #EXPIRE同期・非同期の両方で除去/適用します。

起動(例)

# FreeBSD 例:サービス化は任意
/usr/local/bin/python3 /usr/local/www/zipcloudmilter/async_processor.py &
tail -f /var/log/zipcloudmilter_async.log

安全策

  • キューファイルは 0600、JSONは .part → rename で原子的保存
  • 冪等キーで重複挿入を防止(同一メッセージの再処理対策)
  • Bcc を除去し、受信者ごとに MIME を再構築

6. セキュリティ設計

配布リンクの保護

  • 推測困難なトークン化URL(十分な長さ・無作為性)
  • #LIMIT(回数上限)/ #EXPIRE(有効期限)
  • オプション:#ZIP + パスワード別送
  • 公開停止で即時無効化

保存・転送の安全

  • Nextcloud 側の権限/クォータ/監査ログ
  • HTTPS/TLS による転送経路の暗号化
  • メール本文から実体を除去(リンクのみ)
  • URL 直打ち時も制御値(回数/期限)で遮断

監査・通知

  • 初回DL通知(送信者へ)
  • アクセス履歴で追跡可能
  • 削除/停止操作のイベント記録
  • (任意)IP/UA/地理情報の記録・レポート
ドメイン別ポリシーで cloud / zip / reply を自動切替。相手先のセキュリティ要求や到達性に合わせて最適化します。

7. 障害時の挙動

事象挙動/推奨対応
Nextcloud 一時障害 アップロード失敗時は本文置換を行わず原文を維持するモードを推奨(運用方針で選択)。再送または遅延リトライ。
クォータ不足 体験用/案件用クォータを分離。しきい値到達時は送信者へ通知し、リンク化をスキップ。
DL回数/期限超過 リンクは自動失効。案内画面で送信者への連絡導線を提示。
誤送信に気付いた 公開停止URLから即時無効化。必要に応じてログをエクスポートし、関係先に周知。

8. 非機能要件の目安

  • スループット:本文は軽量(リンク化)→ MTA 負荷を抑制
  • 待ち時間:非同期処理により数秒〜数十秒でリンク生成
  • 可観測性:処理タイムライン/初回DL通知/履歴照会
  • 拡張性:ポリシー・ルーティング・件名コマンドの追加で運用を拡張
段階導入:まずは submission 経路から適用 → 安定後に smtp(受信)へ。