【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設定
example.com. TXT "v=spf1 include:amazonses.com ~all"
DKIM設定
AWS SESでドメインを検証し、3つのCNAMEレコードを追加:
aws ses verify-domain-dkim --domain example.com
DMARC設定(BIMI必須要件)
_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 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サービスを利用可能:
# GitHub CDNの例
https://raw.githubusercontent.com/username/repo/main/logo.svg
STEP 3: サブドメイン別BIMI設定
1. BIMI有効化(st-sub.example.com)
default._bimi.st-sub.example.com. TXT "v=BIMI1; l=https://example.com/logo.svg;"
2. BIMI無効化(example.com)
default._bimi.example.com. TXT "v=BIMI1; l=;"
3. BIMI無効化(sub.example.com)
default._bimi.sub.example.com. TXT "v=BIMI1; l=;"
STEP 4: AWS CLIでの実装例
ドメイン検証
# SESドメイン追加
aws ses verify-domain-identity --domain example.com
# DKIM有効化
aws ses verify-domain-dkim --domain example.com
DNS設定
# 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: テストメール送信
# 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のみ対応 |
推奨アプローチ
- 証明書なしで実装開始 → Yahoo、Fastmailで効果測定
- ROI確認後にCMC購入検討 → Gmail対応のため
- 大企業は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=パラメータの効果:
# 明示的なBIMI拒否(RFC準拠)
default._bimi.example.com. TXT "v=BIMI1; l=; a=;"
# レコードなし(継承が発生する可能性)
# DNS応答: NXDOMAIN
RFC準拠の設定例
本記事の実装がRFC 8617に完全準拠している証拠:
# ✅ 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仕様に基づいた確実なサブドメイン制御が実現されます。
トラブルシューティング
ロゴが表示されない場合
- DNS確認
dig TXT default._bimi.subdomain.example.com
- DMARC確認
dig TXT _dmarc.example.com
# p=quarantine または p=reject が必要
- SVGアクセス確認
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の選択的実装により、以下が実現できました:
- 柔軟なブランディング制御: サブドメインごとにロゴ表示を制御
- 段階的な導入: 一部のサブドメインでテスト後、順次拡大
- コスト効率: 証明書なしでも一部プロバイダーで効果測定可能
BIMI実装は技術的には比較的シンプルですが、実際の表示には送信量やレピュテーションが重要です。まずは証明書なしで効果を測定し、ROIが確認できた段階で証明書の購入を検討することをお勧めします。
参考リンク
- BIMI Group Official Site
- Yahoo BIMI Support
- AWS SES Developer Guide
- RFC 8617 - BIMI Specification
- BIMI RFC Draft (GitHub)
本記事の内容は2025年6月時点の情報に基づいています。BIMIの仕様や各プロバイダーの対応状況は変更される可能性があります。