# 通知設計書 4-Get-DbaDbMailServer

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける `Get-DbaDbMailServer` コマンドの設計仕様を記述したものである。このコマンドはSQL ServerのDatabase Mailで使用されるSMTPサーバーの設定情報を取得するための機能を提供する。

### 本通知の処理概要

`Get-DbaDbMailServer` は、SQL ServerのDatabase Mailアカウントに紐づくSMTPサーバー設定を取得するPowerShellコマンドである。ポート番号、SSL設定、認証方法、接続詳細などの実際のメールサーバー設定を取得できる。

**業務上の目的・背景**：Database MailがメールをSMTPサーバー経由で送信するため、正確なSMTPサーバー設定が不可欠である。このコマンドは、メール配信問題のトラブルシューティング、メールインフラの監査、環境間での設定ドキュメント化に使用される。SSL/TLS設定、ポート番号、認証設定などを確認することで、配信エラーの原因特定が容易になる。

**通知の送信タイミング**：このコマンド自体は通知を送信しない。Database MailのSMTPサーバー設定を「取得」するための読み取り専用コマンドである。ユーザーが明示的にコマンドを実行したときにのみ動作する。

**通知の受信者**：該当なし（情報取得コマンド）。出力結果はコマンド実行者（通常はDBA）がPowerShellコンソールまたはスクリプト内で受け取る。

**通知内容の概要**：SQL ServerインスタンスごとにMailServerオブジェクトを返す。このオブジェクトには、ComputerName、InstanceName、SqlInstance、Account、Name、Port、EnableSsl、ServerType、UserName、UseDefaultCredentials、NoCredentialChangeが含まれる。

**期待されるアクション**：取得した情報をもとに、DBAはSMTPサーバー設定の検証、SSL/TLS構成の確認、認証設定の監査、配信問題の診断などを行う。

## 通知種別

該当なし - 本コマンドはSMTPサーバー設定を取得するための情報取得コマンドであり、通知送信機能は持たない。

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 該当なし（情報取得コマンド） |
| 優先度 | 該当なし |
| リトライ | 該当なし |

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

該当なし - このコマンドは情報取得専用であり、通知送信は行わない。

## 通知テンプレート

該当なし - 通知送信機能なし。

### メール通知の場合

該当なし

### 本文テンプレート

該当なし

### 添付ファイル

該当なし

## テンプレート変数

該当なし

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 手動実行 | ユーザーがコマンドを実行 | なし | 明示的なコマンド実行でのみ動作 |
| パイプライン入力 | InputObjectパラメータへのSqlMailオブジェクト | なし | Get-DbaDbMailからのパイプライン連携可能 |

### 送信抑止条件

該当なし（情報取得コマンド）

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[コマンド実行] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaDbMailで SqlMailオブジェクト取得]
    B -->|No| D{InputObject指定?}
    C --> E[InputObjectに追加]
    D -->|Yes| E
    D -->|No| F[Stop-Function: No servers to process]
    E --> G{InputObject存在?}
    G -->|No| F
    G -->|Yes| H[foreach: 各mailserverを処理]
    H --> I[Get-DbaDbMailAccountで アカウント取得]
    I --> J[accounts.MailServersで サーバーコレクション取得]
    J --> K{Serverパラメータ指定?}
    K -->|Yes| L[指定サーバーでフィルタ]
    K -->|No| M{servers存在?}
    L --> M
    M -->|Yes| N[Add-Member: プロパティ追加]
    M -->|No| P{次のmailserver?}
    N --> O[Select-DefaultView: 既定プロパティ選択]
    O --> P
    P -->|Yes| H
    P -->|No| Q[終了]
    F --> Q
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| SMO MailServer オブジェクト | SMTPサーバー設定を取得 | SQL Server Management Objects経由 |
| msdb.dbo.sysmail_server | SMTPサーバー情報 | SMO経由で間接参照 |
| msdb.dbo.sysmail_account | アカウント情報（親参照） | SMO経由で間接参照 |

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

#### SMO MailServer オブジェクト

| 参照項目（プロパティ名） | 用途 | 取得条件 |
|-------------------|------|---------|
| Name | SMTPサーバー名/ホスト名 | 常に取得 |
| Port | SMTPポート番号（25, 465, 587など） | 常に取得 |
| EnableSsl | SSL/TLS有効フラグ | 常に取得 |
| ServerType | サーバータイプ（通常SMTP） | 常に取得 |
| UserName | 認証ユーザー名 | 常に取得 |
| UseDefaultCredentials | 既定資格情報使用フラグ | 常に取得 |
| NoCredentialChange | 資格情報変更禁止フラグ | 常に取得 |
| Parent.Name | 親アカウント名 | 常に取得 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| なし | - | 読み取り専用コマンド |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| No servers to process | SqlInstanceもInputObjectも指定なし | Stop-Functionでメッセージ出力後、return |
| 一般的な失敗 | サーバー取得時のエラー | Stop-Functionでメッセージ出力後、次へ継続 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

該当なし（情報取得コマンド）

### 配信時間帯

該当なし

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

- SQL Server への接続には Windows認証、SQL Server認証、Active Directory認証がサポートされる
- SqlCredentialパラメータで代替資格情報を指定可能
- MFAが必要な場合は事前にConnect-DbaInstanceを使用する
- 出力にはSMTPサーバー認証ユーザー名が含まれる（パスワードは含まれない）

## 備考

- SQL Server Management Objects (SMO) を使用してサーバー設定を取得
- 出力オブジェクトはMicrosoft.SqlServer.Management.Smo.Mail.MailServer型
- Get-DbaDbMailからパイプライン入力をサポート
- 内部でGet-DbaDbMailAccountを呼び出してアカウント経由でサーバー情報を取得
- Serverパラメータで特定のSMTPサーバーに限定可能
- Accountパラメータで特定のアカウントに関連するサーバーに限定可能

---

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

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

### 推奨読解順序

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

MailServerオブジェクトの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbMailServer.ps1 | `public/Get-DbaDbMailServer.ps1` | 行47-65: .OUTPUTSセクションで返却されるオブジェクト型と既定表示プロパティを確認 |

**読解のコツ**: MailServerオブジェクトはSqlMailAccountの子オブジェクト。Account（親アカウント名）、Name、Port、EnableSsl、ServerType、UserName、UseDefaultCredentials、NoCredentialChangeが既定表示プロパティ。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbMailServer.ps1 | `public/Get-DbaDbMailServer.ps1` | 行89-99: パラメータ定義。SqlInstance、SqlCredential、Server、Account、InputObject、EnableException |

**主要処理フロー**:
1. **行101-103**: SqlInstance指定時はGet-DbaDbMailでSqlMailオブジェクト取得
2. **行105-108**: InputObjectがない場合はStop-Functionで終了
3. **行110**: foreachで各mailserverを処理
4. **行112**: Get-DbaDbMailAccountでアカウント取得（Accountパラメータ対応）
5. **行113**: $accounts.MailServersでサーバーコレクション取得
6. **行115-117**: Serverパラメータによるフィルタリング
7. **行119-124**: servers存在時にAdd-MemberでComputerName、InstanceName、SqlInstance、Account追加
8. **行124**: Select-DefaultViewで既定プロパティを選択して出力

#### Step 3: 依存コマンドとの連携を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbMail.ps1 | `public/Get-DbaDbMail.ps1` | SqlMailオブジェクトの取得処理 |
| 3-2 | Get-DbaDbMailAccount.ps1 | `public/Get-DbaDbMailAccount.ps1` | アカウント経由でMailServersにアクセス |

**主要処理フロー**:
- **行112**: パイプ演算子でGet-DbaDbMailAccountを呼び出し

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

```
Get-DbaDbMailServer
    │
    ├─ Get-DbaDbMail (SqlInstance指定時)
    │      └─ Connect-DbaInstance
    │             └─ SMO Server接続確立
    │
    ├─ Get-DbaDbMailAccount (アカウント取得)
    │      └─ $mailserver.Accounts
    │
    ├─ $accounts.MailServers (サーバーコレクション取得)
    │
    ├─ Where-Object (フィルタリング)
    │      └─ Server パラメータ
    │
    ├─ Add-Member (カスタムプロパティ追加)
    │      ├─ ComputerName
    │      ├─ InstanceName
    │      ├─ SqlInstance
    │      └─ Account
    │
    └─ Select-DefaultView (既定表示プロパティ設定)
```

### データフロー図

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

SqlInstance[]        ───▶  Get-DbaDbMail          ───▶  SqlMail オブジェクト
      or                          │
InputObject(SqlMail)              ▼
                          Get-DbaDbMailAccount    ───▶  SqlMailAccount コレクション
                                  │
                                  ▼
                          $accounts.MailServers   ───▶  MailServer コレクション
                                  │
                                  ▼
                          Where-Object フィルタ   ───▶  フィルタ済みサーバー
                                  │
                                  ▼
                          Add-Member追加          ───▶  拡張MailServer オブジェクト
                                  │
                                  ▼
                          Select-DefaultView      ───▶  パイプライン出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbMailServer.ps1 | `public/Get-DbaDbMailServer.ps1` | ソース | メインコマンド実装 |
| Get-DbaDbMailServer.Tests.ps1 | `tests/Get-DbaDbMailServer.Tests.ps1` | テスト | Pesterユニットテスト |
| Get-DbaDbMail.ps1 | `public/Get-DbaDbMail.ps1` | ソース | 親コマンド（SqlMailオブジェクト取得） |
| Get-DbaDbMailAccount.ps1 | `public/Get-DbaDbMailAccount.ps1` | ソース | 依存コマンド（アカウント取得） |
| Copy-DbaDbMail.ps1 | `public/Copy-DbaDbMail.ps1` | ソース | 関連: メールサーバー設定のコピー |
