# 機能設計書 261-Get-DbaDbMailConfig

## 概要

本ドキュメントは、SQL ServerのDatabase Mail構成設定を取得するGet-DbaDbMailConfigコマンドレットの機能設計を記述する。

### 本機能の処理概要

Get-DbaDbMailConfigは、SQL ServerインスタンスからDatabase Mailの構成値（Configuration Values）を取得するPowerShellコマンドレットである。MaxFileSize、ProhibitedExtensions、DatabaseMailExeMinLifeTime、LoggingLevelなどの設定項目を取得し、メール送信機能の設定状況を監査・確認できる。

**業務上の目的・背景**：Database Mailは、SQL Serverからの自動通知、アラート、レポート送信に使用される重要な機能である。本コマンドは、組織のメールポリシーへの準拠確認、メール配信問題のトラブルシューティング、複数サーバー間での設定統一性検証といった業務課題を解決する。特にセキュリティ監査では、許可される添付ファイル拡張子の確認が重要となる。

**機能の利用シーン**：
- セキュリティ監査時にProhibitedExtensions設定の確認
- メール配信障害時のLoggingLevel設定の確認
- 複数インスタンス間での設定比較・標準化
- 構成管理ドキュメント作成のための設定値収集

**主要な処理内容**：
1. SqlInstanceパラメータまたはパイプライン入力からDatabase Mailオブジェクトを取得
2. ConfigurationValuesコレクションから構成設定を抽出
3. Nameパラメータによるフィルタリング（指定時）
4. サーバー情報（ComputerName、InstanceName、SqlInstance）を付加して出力

**関連システム・外部連携**：SQL Server Management Objects（SMO）のMicrosoft.SqlServer.Management.Smo.Mail.SqlMailクラスを使用してDatabase Mail設定にアクセスする。Get-DbaDbMailコマンドと連携してパイプライン処理が可能。

**権限による制御**：Database Mail構成の読み取りには、msdbデータベースへの適切なアクセス権限が必要。通常、sysadminサーバーロールまたはDatabaseMailUserRoleデータベースロールのメンバーシップが必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 52 | データベースメール | 補助機能 | メール設定の取得 |

## 機能種別

データ取得（SELECT）/ 構成情報参照

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 接続先SQL Serverインスタンス | 有効なインスタンス名 |
| SqlCredential | PSCredential | No | 代替認証用資格情報 | Windows/SQL認証対応 |
| Name | string[] | No | 取得する構成設定名（エイリアス: Config, ConfigName） | 複数値対応 |
| InputObject | Microsoft.SqlServer.Management.Smo.Mail.SqlMail[] | No | パイプライン入力用Database Mailオブジェクト | Get-DbaDbMailからの入力 |
| EnableException | switch | No | 例外を直接スローするかどうか | - |

### 入力データソース

- SqlInstance: ユーザー指定またはパイプライン入力
- InputObject: Get-DbaDbMailコマンドからのパイプライン入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverホスト名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全修飾インスタンス名 |
| Name | string | 構成設定名（例: MaxFileSize, ProhibitedExtensions） |
| Value | string | 構成設定の現在値 |
| Description | string | 構成設定の説明 |

### 出力先

パイプライン出力（Microsoft.SqlServer.Management.Smo.Mail.ConfigurationValue型、追加プロパティ付き）

## 処理フロー

### 処理シーケンス

```
1. 入力パラメータの検証
   └─ SqlInstanceまたはInputObjectのいずれかが必要

2. Database Mailオブジェクトの取得
   └─ SqlInstanceが指定された場合、Get-DbaDbMailを呼び出し
   └─ InputObjectが指定された場合、そのまま使用

3. 入力検証
   └─ InputObjectが空の場合、処理終了

4. 各Database Mailオブジェクトに対して繰り返し
   └─ ConfigurationValuesコレクションを取得
   └─ Nameフィルターが指定された場合、該当設定のみ抽出

5. 出力プロパティの付加
   └─ ComputerName、InstanceName、SqlInstanceを追加

6. 結果の出力
   └─ Select-DefaultViewで既定表示プロパティを設定
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaDbMail呼び出し]
    B -->|No| D[InputObject使用]
    C --> E[InputObject取得]
    D --> E
    E --> F{InputObject存在?}
    F -->|No| G[エラー終了]
    F -->|Yes| H[foreachループ開始]
    H --> I[ConfigurationValues取得]
    I --> J{Name指定?}
    J -->|Yes| K[Where-Objectでフィルタ]
    J -->|No| L[全設定取得]
    K --> M[サーバー情報付加]
    L --> M
    M --> N[結果出力]
    N --> O{次のオブジェクト?}
    O -->|Yes| H
    O -->|No| P[終了]
    G --> P
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 入力必須 | SqlInstanceまたはInputObjectのいずれかが必要 | 常時 |
| BR-002 | 名前フィルタ | Name指定時は完全一致でフィルタリング | Nameパラメータ指定時 |

### 計算ロジック

特になし

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 構成取得 | msdb.dbo.sysmail_configuration | SELECT | SMO経由で内部的に参照 |

### テーブル別操作詳細

#### msdb.dbo.sysmail_configuration

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | paramname, paramvalue, description | 全件または名前フィルタ | SMO経由で読み取り専用アクセス |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 接続エラー | SQL Serverに接続できない | 接続設定・資格情報を確認 |
| - | 入力エラー | サーバー未指定 | SqlInstanceまたはInputObjectを指定 |
| - | 処理エラー | ConfigurationValues取得失敗 | 権限・Database Mail設定を確認 |

### リトライ仕様

なし（即時エラー終了）

## トランザクション仕様

読み取り専用操作のため、明示的なトランザクション制御なし

## パフォーマンス要件

SMOオブジェクトアクセスのため、大量インスタンス処理時は逐次処理となる

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

- 資格情報はPSCredentialオブジェクトで安全に受け渡し
- Windows認証、SQL認証、AD Password認証、AD Integrated認証をサポート
- Database Mail構成へのアクセスには適切な権限が必要

## 備考

- Get-DbaDbMailとのパイプライン連携を推奨
- 複数インスタンスの一括取得には配列またはパイプライン入力を使用

---

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

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

### 推奨読解順序

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

SMO MailオブジェクトとConfigurationValueの関係を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbMailConfig.ps1 | `public/Get-DbaDbMailConfig.ps1` | パラメータ定義（92-100行目）とInputObject型を確認 |

**読解のコツ**: InputObjectの型`Microsoft.SqlServer.Management.Smo.Mail.SqlMail[]`がGet-DbaDbMailの出力型と一致することを確認する。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbMailConfig.ps1 | `public/Get-DbaDbMailConfig.ps1` | processブロック（101行目）が処理のエントリーポイント |

**主要処理フロー**:
1. **102-104行目**: SqlInstance指定時にGet-DbaDbMailを呼び出してInputObjectを取得
2. **106-109行目**: InputObjectが空の場合はStop-Functionで処理終了
3. **111-126行目**: 各mailserverオブジェクトをループ処理

#### Step 3: コア処理ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbMailConfig.ps1 | `public/Get-DbaDbMailConfig.ps1` | ConfigurationValues取得とフィルタリング処理 |

**主要処理フロー**:
- **113行目**: `$mailserver.ConfigurationValues`でSMOから構成値コレクションを取得
- **115-117行目**: Nameパラメータ指定時のWhere-Objectフィルタリング
- **119-121行目**: サーバー識別情報（ComputerName、InstanceName、SqlInstance）をAdd-Memberで付加
- **122行目**: Select-DefaultViewで出力プロパティを制御

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

```
Get-DbaDbMailConfig
    │
    ├─ Get-DbaDbMail（SqlInstance指定時）
    │      └─ Connect-DbaInstance
    │             └─ SQL Server接続
    │
    ├─ SqlMail.ConfigurationValues（SMOプロパティアクセス）
    │      └─ msdb.dbo.sysmail_configurationへのクエリ
    │
    ├─ Where-Object（Nameフィルタリング）
    │
    ├─ Add-Member（プロパティ付加）
    │
    └─ Select-DefaultView（出力整形）
```

### データフロー図

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

SqlInstance ────┐
                ├──▶ Get-DbaDbMail ──▶ SqlMail
InputObject ────┘                          │
                                           ▼
                                  ConfigurationValues
                                           │
Name ───────────────────────────▶ Where-Object フィルタ
                                           │
                                           ▼
                                  Add-Member（サーバー情報付加）
                                           │
                                           ▼
                                  Select-DefaultView
                                           │
                                           ▼
                               [ConfigurationValue + Properties]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbMailConfig.ps1 | `public/Get-DbaDbMailConfig.ps1` | ソース | メイン処理ロジック |
| Get-DbaDbMail.ps1 | `public/Get-DbaDbMail.ps1` | ソース | Database Mailオブジェクト取得 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
