【2025年版】AWS SES + BIMI 実装完全ガイド：サブドメイン別でロゴ表示を制御する方法


# 【2025年版】AWS SES + BIMI 実装完全ガイド：サブドメイン別でロゴ表示を制御する方法

## はじめに

BIMI（Brand Indicators for Message Identification）は、メールにブランドロゴを表示させる新しい技術です。本記事では、AWS SESを使用してBIMIを実装し、さらに**サブドメインごとに選択的にロゴ表示を制御する方法**を解説します。

## 実現する内容

以下のような選択的なBIMI対応を実装します：

- `info@example.com` → BIMI非対応（ロゴなし）
- `info@sub.example.com` → BIMI非対応（ロゴなし） 
- `info@st-sub.example.com` → BIMI対応（ロゴあり）

## 前提条件

- AWS Route53でドメイン管理
- AWS SESでメール送信
- 基本的なSPF/DKIM/DMARC設定済み

## STEP 1: メール認証の基礎設定

### SPF設定
```dns
example.com. TXT "v=spf1 include:amazonses.com ~all"
```

### DKIM設定
AWS SESでドメインを検証し、3つのCNAMEレコードを追加：
```bash
aws ses verify-domain-dkim --domain example.com
```

### DMARC設定（BIMI必須要件）
```dns
_dmarc.example.com. TXT "v=DMARC1; p=reject; rua=mailto:admin@example.com; ruf=mailto:admin@example.com; sp=reject; adkim=r; aspf=r;"
```

**重要**: BIMIにはDMARC enforcement（`p=quarantine`または`p=reject`）が必須です。

## STEP 2: SVGロゴファイルの準備

BIMI用のSVG Tiny 1.2形式ロゴを作成：

```xml
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" 
     viewBox="0 0 200 200" width="200" height="200">
  <title>Company Logo</title>
  <desc>BIMI logo for email authentication</desc>
  
  <!-- ロゴの内容 -->
  <circle cx="100" cy="100" r="90" fill="#2E86C1" stroke="#1B4F72" stroke-width="4"/>
  <!-- その他のSVG要素 -->
</svg>
```

### Webサーバーへの配置

HTTPS対応のWebサーバーにSVGファイルを配置します。GitHub PagesやCDNサービスを利用可能：

```bash
# GitHub CDNの例
https://raw.githubusercontent.com/username/repo/main/logo.svg
```

## STEP 3: サブドメイン別BIMI設定

### 1. BIMI有効化（st-sub.example.com）

```dns
default._bimi.st-sub.example.com. TXT "v=BIMI1; l=https://example.com/logo.svg;"
```

### 2. BIMI無効化（example.com）

```dns
default._bimi.example.com. TXT "v=BIMI1; l=;"
```

### 3. BIMI無効化（sub.example.com）

```dns
default._bimi.sub.example.com. TXT "v=BIMI1; l=;"
```

## STEP 4: AWS CLIでの実装例

### ドメイン検証
```bash
# SESドメイン追加
aws ses verify-domain-identity --domain example.com

# DKIM有効化
aws ses verify-domain-dkim --domain example.com
```

### DNS設定
```bash
# DMARC設定
aws route53 change-resource-record-sets --hosted-zone-id ZXXXXX --change-batch '{
  "Changes": [{
    "Action": "CREATE",
    "ResourceRecordSet": {
      "Name": "_dmarc.example.com",
      "Type": "TXT",
      "TTL": 300,
      "ResourceRecords": [{
        "Value": "\"v=DMARC1; p=reject; rua=mailto:admin@example.com; ruf=mailto:admin@example.com; sp=reject; adkim=r; aspf=r;\""
      }]
    }
  }]
}'

# BIMI設定（有効化）
aws route53 change-resource-record-sets --hosted-zone-id ZXXXXX --change-batch '{
  "Changes": [{
    "Action": "CREATE", 
    "ResourceRecordSet": {
      "Name": "default._bimi.st-sub.example.com",
      "Type": "TXT",
      "TTL": 300,
      "ResourceRecords": [{
        "Value": "\"v=BIMI1; l=https://example.com/logo.svg;\""
      }]
    }
  }]
}'

# BIMI設定（無効化）
aws route53 change-resource-record-sets --hosted-zone-id ZXXXXX --change-batch '{
  "Changes": [{
    "Action": "CREATE",
    "ResourceRecordSet": {
      "Name": "default._bimi.example.com", 
      "Type": "TXT",
      "TTL": 300,
      "ResourceRecords": [{
        "Value": "\"v=BIMI1; l=;\""
      }]
    }
  }]
}'
```

## STEP 5: テストメール送信

```bash
# BIMI対応ドメインからのテスト
aws ses send-email \
  --from "info@st-sub.example.com" \
  --to "test@example.com" \
  --subject "BIMI Test - Logo Expected" \
  --text "This email should display our brand logo."

# BIMI非対応ドメインからのテスト  
aws ses send-email \
  --from "info@example.com" \
  --to "test@example.com" \
  --subject "BIMI Test - No Logo Expected" \
  --text "This email should NOT display any logo."
```

## BIMI証明書について

### 証明書の種類と価格

| 証明書タイプ | 価格（年額） | 要件 |
|------------|------------|------|
| VMC（Verified Mark Certificate） | $1,500〜 | 商標登録必須 |
| CMC（Common Mark Certificate） | $1,089〜 | 商標不要 |
| 証明書なし | $0 | Yahoo/Fastmailのみ対応 |

### 推奨アプローチ

1. **証明書なしで実装開始** → Yahoo、Fastmailで効果測定
2. **ROI確認後にCMC購入検討** → Gmail対応のため
3. **大企業はVMC検討** → 最高レベルの信頼性

## メールプロバイダー対応状況

| プロバイダー | BIMI対応 | 証明書要件 | 備考 |
|-------------|---------|-----------|------|
| Yahoo Mail | ✅ | 不要 | 大量送信者のみ |
| Gmail | ✅ | VMC/CMC必須 | 2021年6月〜 |
| Apple Mail | ✅ | VMC/CMC必須 | iOS16〜 |
| Fastmail | ✅ | 不要 | - |

## RFC 8617仕様に基づく実装

### サブドメインDNSルックアップの仕組み

**RFC 8617で定義されているDNSルックアップ順序:**

```
foo.example.com からのメールの場合：
1. default._bimi.foo.example.com を検索
2. 見つからなければ default._bimi.example.com を検索（継承）
```

### 明示的なBIMI拒否の意味

RFC 8617より：
> "If both the 'l' and 'a' tags are empty, it is an explicit refusal to participate in BIMI. This is critically different than not publishing a BIMI record in the first place."

**空のl=パラメータの効果:**
```dns
# 明示的なBIMI拒否（RFC準拠）
default._bimi.example.com. TXT "v=BIMI1; l=; a=;"

# レコードなし（継承が発生する可能性）
# DNS応答: NXDOMAIN
```

### RFC準拠の設定例

**本記事の実装がRFC 8617に完全準拠している証拠:**

```dns
# ✅ BIMI有効（ロゴ指定）
default._bimi.st-sub.example.com. TXT "v=BIMI1; l=https://example.com/logo.svg;"

# ✅ BIMI明示的拒否（空のl=パラメータ）
default._bimi.example.com. TXT "v=BIMI1; l=;"
default._bimi.sub.example.com. TXT "v=BIMI1; l=;"
```

この設定により、RFC仕様に基づいた**確実なサブドメイン制御**が実現されます。

## トラブルシューティング

### ロゴが表示されない場合

1. **DNS確認**
```bash
dig TXT default._bimi.subdomain.example.com
```

2. **DMARC確認** 
```bash
dig TXT _dmarc.example.com
# p=quarantine または p=reject が必要
```

3. **SVGアクセス確認**
```bash
curl -I https://example.com/logo.svg
# HTTP/2 200 が返ることを確認
```

### Yahoo Mailで表示されない理由

- **送信量不足**: 個人レベルでは表示されない
- **レピュテーション不足**: 新しい送信者は時間が必要
- **時間要件**: 実装後数週間かかる場合あり

## AWS料金について

### 使用リソースと料金

| サービス | 料金 | 備考 |
|---------|------|------|
| Route53 DNS | $0.50/月 | ホストゾーン料金 |
| Route53 クエリ | $0.40/100万クエリ | DNS問い合わせ |
| SES送信 | $0.10/1000通 | サンドボックス無料枠あり |

**月額コスト**: 約$1〜2程度（通常利用）

### 不要リソース削除

テスト後に削除可能なもの：
- 不要なDNSレコード
- 未使用のSESアイデンティティ

削除不要なもの：
- Route53ホストゾーン（ドメイン運用に必要）
- 基本的なSPF/DKIM/DMARCレコード

## まとめ

BIMIの選択的実装により、以下が実現できました：

1. **柔軟なブランディング制御**: サブドメインごとにロゴ表示を制御
2. **段階的な導入**: 一部のサブドメインでテスト後、順次拡大
3. **コスト効率**: 証明書なしでも一部プロバイダーで効果測定可能

BIMI実装は技術的には比較的シンプルですが、実際の表示には送信量やレピュテーションが重要です。まずは証明書なしで効果を測定し、ROIが確認できた段階で証明書の購入を検討することをお勧めします。

## 参考リンク

- [BIMI Group Official Site](https://bimigroup.org/)
- [Yahoo BIMI Support](https://senders.yahooinc.com/bimi/)
- [AWS SES Developer Guide](https://docs.aws.amazon.com/ses/)
- [RFC 8617 - BIMI Specification](https://authindicators.github.io/rfc-brand-indicators-for-message-identification/)
- [BIMI RFC Draft (GitHub)](https://github.com/authindicators/rfc-brand-indicators-for-message-identification)

---

*本記事の内容は2025年6月時点の情報に基づいています。BIMIの仕様や各プロバイダーの対応状況は変更される可能性があります。*