# 通知設計書 14-mu4e-notification-support

## 概要

本ドキュメントは、Doom Emacsのmu4eメールモジュールにおける通知サポート機能の設計仕様を記述する。この機能は、mu4eメールクライアントで新着メールを検知した際に、OS通知やモードライン更新を通じてユーザーに通知する。

### 本通知の処理概要

mu4e-notification-supportは、mu4eの新着メール検知機能を有効化し、未読メールの存在をユーザーに通知するための基盤設定である。この設定をtにすることで、mu4eはモードラインの更新やmu4e-alertパッケージとの連携が可能になる。

**業務上の目的・背景**：メールは業務コミュニケーションの中核であり、重要なメールをタイムリーに確認することは生産性に直結する。しかし、Emacsで他の作業を行っている間にメールボックスを常時監視することは非効率である。本機能により、新着メールがあった場合に通知を受け取ることができ、重要な連絡を見逃すリスクを軽減できる。

**通知の送信タイミング**：mu4eがメールインデックスを更新し、新着メールを検知した際に通知が発生する。メールの取得はmu4e-update-interval設定またはユーザーの手動操作（U キー）によってトリガーされる。

**通知の受信者**：通知はEmacsを実行しているローカルユーザーに表示される。モードラインの更新、またはmu4e-alertパッケージを併用する場合はデスクトップ通知も可能。

**通知内容の概要**：モードラインには未読メール数、新着メール数などのアイコンと数字が表示される。mu4e-alertを使用する場合は、送信者、件名などの詳細情報も含むデスクトップ通知が可能。

**期待されるアクション**：ユーザーは通知を確認後、必要に応じてmu4eを起動（SPC o m）してメールを確認・返信することが期待される。

## 通知種別

複合通知
- モードライン更新（Emacs内）
- デスクトップ通知（mu4e-alert併用時、オプション）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期（インデックス更新完了時） |
| 優先度 | 中 |
| リトライ | なし |

### 送信先決定ロジック

通知はローカルのEmacsセッションに表示される。モードラインは常に更新され、mu4e-alertが有効な場合はデスクトップ通知も発生する。

## 通知テンプレート

### モードライン通知の場合

| 項目 | 内容 |
|-----|------|
| 全既読時 | mu4e-modeline-all-clear アイコン |
| 全未読確認済み | mu4e-modeline-all-read アイコン |
| 未読あり | mu4e-modeline-unread-items アイコン + 件数 |
| 新着あり | mu4e-modeline-new-items アイコン + 件数 |

### 本文テンプレート

モードライン表示例：
```
C: [check icon]   -- 全クリア
R: [email check] -- 全既読
U: [email alert] 5 -- 未読5件
N: [sync icon] 3  -- 新着3件
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| N/A | - | - | モードライン/デスクトップ通知のため添付なし |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| unread-count | 未読メール件数 | mu4eインデックス | Yes |
| new-count | 新着メール件数 | mu4eインデックス | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| スケジュール | mu4e-update-interval | インデックス更新完了 | 定期的なメール取得時 |
| 画面操作 | U キー押下 | インデックス更新完了 | 手動メール取得時 |
| イベント | mu4e起動 | 常時 | mu4e起動時のインデックス取得 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| mu4e-notification-support が nil | 通知サポートが無効な場合 |
| 新着メールなし | インデックス更新で新着がない場合（モードライン更新のみ） |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[メール取得トリガー] --> B[mbsync/offlineimap実行]
    B --> C[mu indexコマンド実行]
    C --> D[インデックス更新完了]
    D --> E{mu4e-notification-support?}
    E -->|nil| F[通知なし]
    E -->|t| G[モードライン更新]
    G --> H{新着メールあり?}
    H -->|No| I[終了]
    H -->|Yes| J{mu4e-alert有効?}
    J -->|No| I
    J -->|Yes| K[デスクトップ通知送信]
    K --> I
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| mu index (Xapian) | メールインデックス参照 | mu4eの内部データストア |

### テーブル別参照項目詳細

#### mu index

| 参照項目 | 用途 | 取得条件 |
|---------|------|---------|
| 未読フラグ | 未読メール数カウント | flag:unread |
| 新着フラグ | 新着メール数カウント | flag:new |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| N/A | - | 通知機能自体はインデックスを更新しない |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| インデックス更新失敗 | muコマンドエラー | エラーメッセージをログに記録 |
| メール取得失敗 | mbsync/offlineimapエラー | 次回更新時にリトライ |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | mu4e-update-intervalによる自動リトライ |
| リトライ間隔 | mu4e-update-interval設定値（デフォルト: nil） |
| リトライ対象エラー | メール取得・インデックス更新エラー |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | mu4e-update-intervalに依存 |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（mu4e実行中は常時有効）

## セキュリティ考慮事項

- メールの件名や送信者情報がデスクトップ通知に表示される場合、機密情報漏洩のリスクがある
- 公開の場での使用時は通知内容の設定に注意が必要
- smtpmail-smtp-userなどの認証情報は安全に管理すること

## 備考

- mu4e-update-intervalはDoom Emacsではnilに設定されており、自動更新は無効
- ユーザーが手動でUキーを押すか、外部のcronジョブでメール取得を行う想定
- mu4e-alertパッケージは別途インストール・設定が必要

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

mu4eの通知関連設定を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/email/mu4e/config.el` | mu4e-notification-support設定（行99） |

**読解のコツ**: setqでmu4e-notification-supportをtに設定することで通知サポートが有効化される。

#### Step 2: エントリーポイントを理解する

mu4eパッケージの設定とモードラインアイコンの初期化を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/email/mu4e/config.el` | use-package! mu4eブロック（行14-141） |
| 2-2 | email.el | `modules/email/mu4e/autoload/email.el` | +mu4e-initialise-icons関数（行138-159） |

**主要処理フロー**:
1. **行99**: `mu4e-notification-support t`で通知サポート有効化
2. **行138-159**: モードラインアイコンの初期化

#### Step 3: モードラインアイコン設定を理解する

Nerd Fontsを使用したアイコン設定を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | email.el | `modules/email/mu4e/autoload/email.el` | +mu4e-initialise-icons関数内のモードライン設定（行141-148） |

**主要処理フロー**:
- **行141**: mu4e-modeline-all-clear（全クリア表示）
- **行142**: mu4e-modeline-all-read（全既読表示）
- **行143**: mu4e-modeline-unread-items（未読表示）
- **行144**: mu4e-modeline-new-items（新着表示）

### プログラム呼び出し階層図

```
mu4e起動 / U キー押下
    │
    └─ mu4e-get-mail-command実行（mbsync --all）
           │
           └─ mu index更新
                  │
                  └─ mu4e-notification-support = t
                         │
                         ├─ モードライン更新
                         │      └─ +mu4e-initialise-icons設定のアイコン表示
                         │
                         └─ [mu4e-alert有効時] デスクトップ通知
```

### データフロー図

```
[入力]               [処理]                    [出力]

メール取得 ───▶ mbsync/offlineimap ───▶ ローカルMaildir
                                              │
                                              ▼
                                        mu index更新
                                              │
                                              ▼
                                        mu4e-notification-support
                                              │
                                              ├─▶ モードライン
                                              │
                                              └─▶ [mu4e-alert] デスクトップ通知
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/email/mu4e/config.el` | ソース | mu4e設定、通知サポート有効化 |
| email.el | `modules/email/mu4e/autoload/email.el` | ソース | モードラインアイコン初期化 |
| packages.el | `modules/email/mu4e/packages.el` | 設定 | mu4e-compatパッケージ定義 |
