# 通知設計書 12-MessagesMailer#notification

## 概要

本ドキュメントは、ActionTextと連携したメッセージ通知メールについて、設計情報を記載するものである。

### 本通知の処理概要

MessagesMailer#notificationは、ActionText機能のテスト用ダミーアプリケーション内で定義されたメーラーである。リッチテキストコンテンツを含むメッセージの新着通知をメールで送信する機能を提供する。ActionMailerのParameterizedモジュールを使用し、メッセージオブジェクトと受信者をパラメータとして受け取る。

**業務上の目的・背景**：本メーラーは、ActionTextのリッチテキストエディタで作成されたメッセージコンテンツをメール通知に組み込むデモンストレーション・テスト用として設計されている。実際のアプリケーションでは、掲示板やメッセージングシステムで新しいメッセージが投稿された際に、関係者へ通知を送信する用途で使用される。

**通知の送信タイミング**：アプリケーションコードから`MessagesMailer.with(message: ..., recipient: ...).notification`が呼び出された時点でメールが生成される。

**通知の受信者**：パラメータ`recipient`に指定されたメールアドレスが宛先となる。

**通知内容の概要**：件名にはメッセージのsubjectが含まれ、本文にはActionTextで作成されたリッチテキストコンテンツが表示される。

**期待されるアクション**：受信者は新着メッセージを確認し、必要に応じてアプリケーションにアクセスして返信等のアクションを行う。

## 通知種別

メール通知（Email）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（deliver_now）または非同期（deliver_later） |
| 優先度 | 中（アプリケーション設定による） |
| リトライ | Active Jobの設定に依存（deliver_later使用時） |

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

1. `MessagesMailer.with(message: xxx, recipient: yyy)`でパラメータを設定
2. `params[:recipient]`がToヘッダーに直接設定される
3. `params[:message]`から件名と本文コンテンツを取得

## 通知テンプレート

### メール通知の場合

| 項目 | 内容 |
|-----|------|
| 送信元アドレス | ApplicationMailerのdefault設定に依存 |
| 送信元名称 | ApplicationMailerのdefault設定に依存 |
| 件名 | NEW MESSAGE: {message.subject} |
| 形式 | HTML（text/html） |

### 本文テンプレート

```html
<div id="message-content"><%= @message.content %></div>
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| なし | - | - | 本メーラーには添付ファイルなし（ActionTextのインライン添付は別途処理） |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| @message | メッセージオブジェクト | params[:message] | Yes |
| @message.subject | メッセージの件名 | Messageモデルのsubject属性 | Yes |
| @message.content | メッセージのリッチテキストコンテンツ | ActionText::RichText | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API呼び出し | MessagesMailer.with(...).notification | パラメータが正しく設定されていること | アプリケーションコードからの呼び出し |
| モデルコールバック | Message作成後 | 受信者が設定されていること | 新規メッセージ作成時の自動通知（実装による） |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| perform_deliveries = false | ActionMailer設定で配信が無効化されている場合 |
| パラメータ不正 | messageまたはrecipientが未設定の場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[MessagesMailer.with params 呼び出し] --> B[Parameterized::Mailer生成]
    B --> C[notification メソッド呼び出し]
    C --> D[MessageDelivery生成]
    D --> E{deliver_now or deliver_later?}
    E -->|deliver_now| F[同期処理]
    E -->|deliver_later| G[Active Jobキューイング]
    F --> H[notification メソッド実行]
    G --> H
    H --> I[@message = params取得]
    I --> J[件名生成: NEW MESSAGE + subject]
    J --> K[mail メソッド実行]
    K --> L[notification.html.erb レンダリング]
    L --> M[ActionText content展開]
    M --> N[Mail::Message生成]
    N --> O[deliver.action_mailer計装イベント]
    O --> P[メール送信]
    P --> Q[送信完了]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| messages | メッセージ情報取得 | subject属性を参照 |
| action_text_rich_texts | リッチテキストコンテンツ取得 | ActionTextの関連テーブル |

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

#### messages

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| subject | メール件名に使用 | params[:message]経由 |

#### action_text_rich_texts

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| body | メール本文に使用 | message.content経由 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| なし | - | 本メーラーはデータベースを更新しない |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| パラメータ未設定 | params[:message]またはparams[:recipient]がnil | 呼び出し元で適切なパラメータを設定する |
| テンプレートエラー | ビューレンダリング失敗 | テンプレートを確認・修正する |
| ActionText関連エラー | content取得失敗 | ActionTextの設定を確認 |
| 配信エラー | SMTPサーバー接続失敗等 | rescue_fromで例外処理、またはリトライ |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | Active Job設定に依存（deliver_later時） |
| リトライ間隔 | Active Job設定に依存 |
| リトライ対象エラー | Net::SMTPError等の一時的なエラー |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 設定なし（SMTPサーバーの制限に依存） |
| 1日あたり上限 | 設定なし |

### 配信時間帯

制限なし

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

- ActionTextのコンテンツはサニタイズされているが、メール表示時のXSS対策を確認する
- 受信者のメールアドレスは個人情報として適切に管理する
- リッチテキストに埋め込まれた添付ファイルは適切なアクセス制御を行う

## 備考

- 本メーラーはActionTextのテストダミーアプリケーション内に定義されている
- ApplicationMailerを継承しているため、アプリケーション共通のdefault設定が適用される
- ActionText::RichTextのcontentメソッドにより、リッチテキストがHTML形式で展開される

---

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

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

### 推奨読解順序

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

メッセージオブジェクトとActionTextの関連を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | messages_mailer.rb | `actiontext/test/dummy/app/mailers/messages_mailer.rb` | メーラークラス定義、paramsの使用方法 |
| 1-2 | notification.html.erb | `actiontext/test/dummy/app/views/messages_mailer/notification.html.erb` | ビューテンプレートの構造 |

**読解のコツ**: @message.contentはActionText::RichTextオブジェクトを返し、ビューでそのまま出力するとHTML化されたリッチテキストが展開される。

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

MessagesMailerクラスの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | messages_mailer.rb | `actiontext/test/dummy/app/mailers/messages_mailer.rb` | notificationメソッドの実装 |

**主要処理フロー**:
1. **行1**: `ApplicationMailer`を継承したMessagesMailerクラス定義
2. **行2-5**: `notification`メソッドでparams[:message]を@messageに設定
3. **行4**: `mail to: params[:recipient], subject: "NEW MESSAGE: #{@message.subject}"`でメール生成

#### Step 3: ビューテンプレートを理解する

HTMLメールテンプレートの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | notification.html.erb | `actiontext/test/dummy/app/views/messages_mailer/notification.html.erb` | ActionTextコンテンツの展開方法 |

**主要処理フロー**:
- **行1**: `<div id="message-content"><%= @message.content %></div>`でActionTextコンテンツを出力

#### Step 4: ActionMailer基底クラスを理解する

mailメソッドの動作を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | base.rb | `actionmailer/lib/action_mailer/base.rb` | mailメソッドの実装、テンプレート自動検索 |

**主要処理フロー**:
- **行865-898**: mailメソッドがテンプレートを自動検索しレンダリング

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

```
MessagesMailer.with(message: m, recipient: r)
    │
    ├─ ActionMailer::Parameterized::ClassMethods#with
    │      └─ Parameterized::Mailer.new(self, params)
    │
    └─ .notification
           └─ Parameterized::MessageDelivery.new
                  │
                  ├─ #deliver_now または #deliver_later
                  │      └─ #processed_mailer
                  │             └─ mailer.process(:notification)
                  │
                  └─ MessagesMailer#notification
                         ├─ @message = params[:message]
                         └─ mail(to: ..., subject: ...)
                                └─ notification.html.erb レンダリング
                                       └─ @message.content 展開
```

### データフロー図

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

params[:message] ─────────▶ @message = ... ─────┬───▶ @message.subject → 件名
                                                │
                                                └───▶ @message.content → 本文HTML

params[:recipient] ────────────────────────────────▶ to ヘッダー

                           mail() ─────────────────▶ Mail::Message
                                │
                                └─ テンプレート検索 ─▶ notification.html.erb
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| messages_mailer.rb | `actiontext/test/dummy/app/mailers/messages_mailer.rb` | ソース | MessagesMailerクラス定義 |
| notification.html.erb | `actiontext/test/dummy/app/views/messages_mailer/notification.html.erb` | テンプレート | メール本文HTMLテンプレート |
| application_mailer.rb | `actiontext/test/dummy/app/mailers/application_mailer.rb` | ソース | 基底メーラークラス |
| base.rb | `actionmailer/lib/action_mailer/base.rb` | ソース | ActionMailer基底クラス |
| parameterized.rb | `actionmailer/lib/action_mailer/parameterized.rb` | ソース | Parameterizedモジュール |
