# 通知設計書 5-BaseMailer#inline_attachment

## 概要

本ドキュメントは、Rails ActionMailerフレームワークにおけるBaseMailer#inline_attachmentメソッドによるインライン添付ファイル付きメール通知の設計を記述する。

### 本通知の処理概要

BaseMailer#inline_attachmentは、HTMLメール本文内に画像をインラインで埋め込むメールを送信するためのテスト用メーラーメソッドである。インライン添付ファイルを使用することで、メール本文中に画像を表示でき、Content-Typeがmultipart/relatedとなるマルチパートメールを生成する。

**業務上の目的・背景**：企業ロゴ、署名画像、製品画像など、メール本文内に直接表示したい画像がある場合に使用される。外部リンクではなくメール自体に画像を含めることで、画像のブロック設定に関係なく表示できる。本実装はテスト用であり、attachments.inlineによるインライン添付ファイル機能の動作確認を主目的とする。

**通知の送信タイミング**：メーラーメソッドが呼び出された時点で送信される。

**通知の受信者**：デフォルトでは`system@test.lindsaar.net`宛に送信される（BaseMailerのクラスデフォルト設定）。

**通知内容の概要**：logo.pngをインライン添付ファイルとして含み、HTMLテンプレートからimage_tagヘルパーで参照される。メール構造はmultipart/related > multipart/alternative > text/plain, text/html + image/png となる。

**期待されるアクション**：受信者はメール本文内に埋め込まれた画像を確認できる。テスト用途では、インライン添付ファイルのContent-ID参照と、multipart/related構造が正しく生成されることを確認する。

## 通知種別

メール

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（deliver_now）/ 非同期（deliver_later） |
| 優先度 | 中（デフォルト） |
| リトライ | 配信メソッドに依存 |

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

BaseMailerのクラスデフォルト設定として`system@test.lindsaar.net`が指定されている。

## 通知テンプレート

### メール通知の場合

| 項目 | 内容 |
|-----|------|
| 送信元アドレス | jose@test.plataformatec.com |
| 送信元名称 | （未設定） |
| 件名 | Inline attachment（I18nデフォルト） |
| 形式 | multipart/related |

### 本文テンプレート

#### HTMLパート（inline_attachment.html.erb）

```html
<h1>Inline Image</h1>

<%= image_tag attachments['logo.png'].url %>

<p>This is an image that is inline</p>
```

#### テキストパート（inline_attachment.text.erb）

```
Inline Image

No image for you
```

テンプレートファイル:
- `actionmailer/test/fixtures/base_mailer/inline_attachment.html.erb`
- `actionmailer/test/fixtures/base_mailer/inline_attachment.text.erb`

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| logo.png | image/png | 常に添付 | インライン表示用のロゴ画像 |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| attachments['logo.png'] | インライン添付ファイルオブジェクト | attachments.inline設定 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API呼び出し | `BaseMailer.inline_attachment` メソッド実行 | なし（常に送信） | メーラーメソッドの直接呼び出し |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| perform_deliveries = false | ActionMailerの設定で配信を無効化している場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[BaseMailer.inline_attachment 呼び出し] --> B[MessageDelivery オブジェクト生成]
    B --> C[deliver_now/deliver_later 呼び出し]
    C --> D[メーラーインスタンス生成]
    D --> E[inline_attachment メソッド実行]
    E --> F[attachments.inline でインライン添付設定]
    F --> G[mail メソッド呼び出し]
    G --> H[テンプレート検索 text/html 両方発見]
    H --> I[multipart/alternative パート生成]
    I --> J[インライン添付ファイルをラップ]
    J --> K[multipart/related 構造生成]
    K --> L[Mail::Message 生成]
    L --> M[配信処理]
    M --> N[終了]
```

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

### 参照テーブル一覧

本メソッドはデータベースを参照しない（テスト用メーラー）。

### 更新テーブル一覧

本メソッドはデータベースを更新しない。

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| テンプレート未検出 | inline_attachment.*テンプレートが存在しない場合 | ActionView::MissingTemplate例外 |
| 添付ファイル参照エラー | テンプレート内でattachments['logo.png']が未定義 | nilエラー |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | ActiveJob設定に依存（deliver_later使用時） |
| リトライ間隔 | ActiveJob設定に依存 |
| リトライ対象エラー | StandardError |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 設定なし |
| 1日あたり上限 | 設定なし |

### 配信時間帯

制限なし

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

- インライン添付ファイルはBase64エンコードされるため、メールサイズが増大する
- 添付ファイルの内容検証は行われない（任意のバイナリデータを添付可能）
- テスト用メーラーのため、本番環境での使用は非推奨

## 備考

- attachments.inlineを使用すると、Content-Dispositionがinlineに設定される
- HTMLテンプレート内でattachments['logo.png'].urlを使用してContent-IDでファイルを参照
- インライン添付のみの場合はmultipart/related、通常添付と混在する場合はmultipart/mixedとなる

---

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

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

### 推奨読解順序

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

インライン添付ファイル付きメールのMIME構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | base.rb | `actionmailer/lib/action_mailer/base.rb` | L756-762: attachmentsメソッドの実装 |
| 1-2 | base.rb | `actionmailer/lib/action_mailer/base.rb` | L1014-1033: wrap_inline_attachmentsメソッド |

**読解のコツ**: インライン添付ファイルはmultipart/relatedでラップされ、メール本文パーツ（multipart/alternative）と一緒に配置される。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | base_mailer.rb | `actionmailer/test/mailers/base_mailer.rb` | L47-50: inline_attachmentメソッドの実装 |

**主要処理フロー**:
1. **L48**: `attachments.inline["logo.png"] = "\312\213\254\232"` - インライン添付ファイルの設定（バイナリデータ）
2. **L49**: `mail` - 引数なしでmailメソッド呼び出し

#### Step 3: Content-Type決定ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | base.rb | `actionmailer/lib/action_mailer/base.rb` | L901-926: set_content_typeメソッド |

**主要処理フロー**:
- **L915-918**: `if m.has_attachments?` - 添付ファイルがある場合の分岐
- **L916-917**: `if m.attachments.all?(&:inline?)` - 全てインライン添付の場合はmultipart/related

#### Step 4: テストケースで動作を確認する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | base_test.rb | `actionmailer/test/base_test.rb` | L188-198: インライン添付ファイルのテスト |

**主要処理フロー**:
- **L189-190**: `email = BaseMailer.inline_attachment` + `email.encoded`
- **L192**: `assert_equal("multipart/related", email.mime_type)` - Content-Typeの検証
- **L193-196**: パート構造の検証（multipart/alternative、text/plain、text/html）
- **L197**: `assert_equal("logo.png", email.parts[1].filename)` - 添付ファイル名の検証

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

```
BaseMailer.inline_attachment
    │
    ├─ ActionMailer::Base.method_missing
    │      └─ MessageDelivery.new(self, :inline_attachment)
    │
    └─ MessageDelivery#deliver_now
           │
           ├─ processed_mailer
           │      └─ BaseMailer.new.process(:inline_attachment)
           │             │
           │             └─ BaseMailer#inline_attachment
           │                    │
           │                    ├─ attachments.inline["logo.png"] = バイナリデータ
           │                    │      └─ Mail::Message#attachments.inline
           │                    │
           │                    └─ mail
           │                           │
           │                           ├─ collect_responses_from_templates
           │                           │      └─ inline_attachment.html.erb
           │                           │      └─ inline_attachment.text.erb
           │                           │
           │                           ├─ create_parts_from_responses
           │                           │      └─ multipart/alternative生成
           │                           │
           │                           └─ set_content_type
           │                                  └─ multipart/related
           │
           └─ message.deliver
```

### データフロー図

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

logo.png バイナリデータ    ───▶ attachments.inline["logo.png"]  ───▶ インライン添付パート
  "\312\213\254\232"             │                                    Content-ID: <...>
                                 ▼
inline_attachment.html.erb ───▶ render                           ───▶ HTMLパート
  <%= image_tag                  │                                    (cid: URL参照)
      attachments['logo.png']    │
      .url %>                    ▼
                            ───▶ wrap_inline_attachments         ───▶ multipart/related
inline_attachment.text.erb ───▶ render                                │
                                 │                                    ├─ multipart/alternative
                                 ▼                                    │   ├─ text/plain
                            ───▶ set_content_type                     │   └─ text/html
                                 └─ 全添付がinline                     │
                                      → multipart/related             └─ image/png (inline)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| base_mailer.rb | `actionmailer/test/mailers/base_mailer.rb` | ソース | テスト用メーラークラス定義 |
| base.rb | `actionmailer/lib/action_mailer/base.rb` | ソース | インライン添付処理ロジック |
| inline_attachment.html.erb | `actionmailer/test/fixtures/base_mailer/inline_attachment.html.erb` | テンプレート | HTMLメール本文 |
| inline_attachment.text.erb | `actionmailer/test/fixtures/base_mailer/inline_attachment.text.erb` | テンプレート | テキストメール本文 |
| base_test.rb | `actionmailer/test/base_test.rb` | テスト | インライン添付機能テスト |
