DKIM セレクタの見つけ方 — プロバイダー別の命名規則と自動検知の限界
DKIM の設定を確認するには、ドメイン名だけでなく「セレクタ」と呼ばれる識別子が必要です。セレクタ名はメールサービスごとに異なり、正しい名前を知らなければ DNS を引いても何も返ってきません。この記事では、主要プロバイダーのセレクタ命名規則を整理し、dig と API による確認手順、自動検知が機能しないケースの対処法を解説します。
DKIM セレクタとは何か
DKIM(DomainKeys Identified Mail)は、送信メールに電子署名を付与し、受信サーバーが送信元の正当性を検証する仕組みです。署名に対応する公開鍵は DNS の TXT レコードとして公開されますが、レコードの場所を特定するために「セレクタ」を使います。
DNS 上のレコードは {セレクタ}._domainkey.{ドメイン} という形式で配置されます。セレクタが google でドメインが example.com であれば、公開鍵の問い合わせ先は google._domainkey.example.com です。受信サーバーはメールヘッダーの DKIM-Signature に含まれる s= フィールドからセレクタ名を読み取り、DNS を引いて公開鍵を取得します。
セレクタの値にはメールサービスごとの規則があります。規則を知っていれば、メールヘッダーを見なくてもセレクタ名を推測できます。
プロバイダー別のセレクタ命名規則
主要なメールサービスが使用するセレクタ名を以下にまとめます。
| プロバイダー | セレクタ名 | レコード種別 |
|---|---|---|
| Google Workspace | google | TXT |
| Microsoft 365 | selector1, selector2 | CNAME |
| SendGrid | s1, s2 | CNAME |
| Mailchimp / Mandrill | mte1, mte2 | CNAME |
| Mailgun | pdk1, pdk2 | CNAME |
| Fastmail | mesmtp | TXT or CNAME |
| Zoho | zoho | TXT |
2 つのセレクタを持つプロバイダーは、鍵のローテーション(交代)に対応しています。片方の鍵を更新している間、もう片方が署名を継続するため、切り替え時にメール認証が途切れません。
CNAME ベースと TXT ベースの違い
セレクタのレコード種別には CNAME と TXT の 2 種類があります。運用上の責任範囲が異なるため、違いを把握しておく必要があります。
CNAME ベース(プロバイダー管理)
Microsoft 365、SendGrid、Mailchimp、Mailgun が採用している方式です。自分のドメインの DNS に CNAME レコードを登録し、プロバイダーが管理する DNS ホストを参照します。
selector1._domainkey.example.com. CNAME selector1-example-com._domainkey.example.onmicrosoft.com.
公開鍵の実体はプロバイダー側の DNS にあります。プロバイダーが鍵のローテーションを自動的に実行するため、利用者が鍵を手動で更新する必要はありません。
TXT ベース(自分で管理)
Google Workspace と Zoho が採用している方式です。公開鍵の値を自分のドメインの DNS に TXT レコードとして直接登録します。
google._domainkey.example.com. TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqh..."
鍵の更新が必要になった場合は、自分で新しい公開鍵を DNS に登録します。プロバイダーの管理画面で鍵を再生成した後、DNS の TXT レコードを手動で書き換える作業が発生します。
dig でセレクタを確認する
セレクタ名がわかっていれば、dig コマンドで公開鍵の存在を直接確認できます。example.com を自分のドメインに置き換えて実行してみてください。
TXT レコードを直接引く場合
dig TXT google._domainkey.example.com +short
"v=DKIM1; k=rsa; p=MIIBIjANBgkqh..."
v=DKIM1 で始まるレコードが返れば、そのセレクタで DKIM の公開鍵が公開されています。
CNAME レコードの場合
CNAME ベースのプロバイダーでは、TXT を指定しても CNAME 先を辿った結果が返ります。CNAME の参照先を確認したい場合は、レコードタイプを CNAME に指定します。
dig CNAME selector1._domainkey.example.com +short
selector1-example-com._domainkey.example.onmicrosoft.com.
CNAME 先のホスト名が返れば、プロバイダーの DNS を正しく参照しています。何も返らない場合は、CNAME レコードの登録が漏れているか、セレクタ名が間違っています。
複数のプロバイダーを順番に確認する
1 つのドメインから Google Workspace と SendGrid の両方でメールを送信しているケースでは、セレクタごとに dig を実行します。
dig TXT google._domainkey.example.com +short
dig CNAME s1._domainkey.example.com +short
dig CNAME s2._domainkey.example.com +short
使用しているプロバイダーの数だけコマンドを繰り返す必要があります。セレクタ名を間違えると何も返らないため、前述の命名規則表と照合しながら確認してください。
Labee API で外部視点から確認する
dig はローカルのリゾルバーを経由するため、キャッシュや社内 DNS の影響を受けます。外部のリゾルバーからセレクタの状態を確認するには、Labee Dev Toolbox のメール認証 API が使えます。
セレクタを指定して確認する
セレクタ名がわかっている場合は selector パラメーターで指定します。example.com を自分のドメインに置き換えて実行してみてください。
curl "https://labee.dev/api/mail-auth?domain=example.com&selector=google"
{
"success": true,
"data": {
"spf": {
"record": "v=spf1 include:_spf.google.com ~all",
"exists": true
},
"dkim": {
"mode": "explicit",
"record": "v=DKIM1; k=rsa; p=MIIBIjANBgkqh...",
"exists": true,
"selector": "google"
},
"dmarc": {
"record": "v=DMARC1; p=none; rua=mailto:dmarc@example.com",
"exists": true,
"source": "exact",
"domain": "example.com"
},
"bimi": {
"record": null,
"exists": false
}
},
"error": null,
"meta": { "responseTime": 85 }
}
mode: "explicit" は、指定されたセレクタのみを検索したことを示します。dkim.exists が true なら、そのセレクタで DKIM の公開鍵が外部から取得できる状態です。
セレクタを省略して自動検知する
セレクタ名がわからない場合は、selector パラメーターを省略します。
curl "https://labee.dev/api/mail-auth?domain=example.com"
{
"success": true,
"data": {
"spf": {
"record": "v=spf1 include:_spf.google.com ~all",
"exists": true
},
"dkim": {
"mode": "auto",
"record": "v=DKIM1; k=rsa; p=MIIBIjANBgkqh...",
"exists": true,
"selector": "google",
"matches": [
{ "selector": "google", "record": "v=DKIM1; k=rsa; p=MIIBIjANBgkqh...", "exists": true }
],
"checkedSelectors": ["google", "selector1", "selector2", "s1", "s2", "k1", "k2", "k3", "default", "dkim", "mail", "smtp", "mte1", "mte2", "pdk1", "pdk2", "mesmtp", "zoho"],
"exhaustive": false
},
"dmarc": {
"record": "v=DMARC1; p=none; rua=mailto:dmarc@example.com",
"exists": true,
"source": "exact",
"domain": "example.com"
},
"bimi": {
"record": null,
"exists": false
}
},
"error": null,
"meta": { "responseTime": 142 }
}
mode: "auto" のとき、API は checkedSelectors に列挙された 18 種類 のセレクタ候補を並列に検索します。一致したセレクタは matches 配列に格納され、selector フィールドには最初に見つかったセレクタ名が入ります。
"exhaustive": false は、この検索がすべてのセレクタを網羅していないことを明示しています。候補リストは Google Workspace、Microsoft 365、SendGrid、Mailchimp、Mailgun、Fastmail、Zoho に加えて、default、dkim、mail、smtp、k1〜k3 という汎用的な名前をカバーしていますが、プロバイダー固有のランダムな名前や独自の命名規則には対応できません。
自動検知が機能しないケース
auto モードの 18 種類 のセレクタ候補でカバーできないプロバイダーが存在します。代表例が AWS SES の Easy DKIM です。
AWS SES Easy DKIM
AWS SES の Easy DKIM は、セレクタ名に推測可能なパターンが存在しません。セレクタは AWS が内部で生成した文字列で構成されており、以下のような形式になります。
abcdef1234ghijkl._domainkey.example.com. CNAME abcdef1234ghijkl.dkim.amazonses.com.
abcdef1234ghijkl の部分は AWS が自動生成した値であり、ドメイン名やアカウント ID から導出する規則がありません。auto モードの候補リストに含めることができないため、API の自動検知では AWS SES の DKIM を検出できません。
独自セレクタを使用している場合
社内のメールサーバーで独自のセレクタ名(例: corporate-2024、mail-prod)を設定している場合も、候補リストに含まれないため自動検知の対象外です。
検知できない場合の対処法
自動検知で DKIM が見つからなかったとき、セレクタ名を特定する方法は 2 つあります。
メールヘッダーから取得する
対象ドメインから送信されたメールを 1 通受信し、メールヘッダーの DKIM-Signature を確認します。Gmail であれば「メッセージのソースを表示」からヘッダー全文を表示できます。
DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=abcdef1234ghijkl;
s= に続く文字列がセレクタ名です。この値を dig や API の selector パラメーターに渡せば、公開鍵の存在を確認できます。
dig TXT abcdef1234ghijkl._domainkey.example.com +short
"v=DKIM1; k=rsa; p=MIIBIjANBgkqh..."
API でも同様に確認できます。
curl "https://labee.dev/api/mail-auth?domain=example.com&selector=abcdef1234ghijkl"
{
"success": true,
"data": {
"spf": { "record": "v=spf1 include:amazonses.com ~all", "exists": true },
"dkim": {
"mode": "explicit",
"record": "v=DKIM1; k=rsa; p=MIIBIjANBgkqh...",
"exists": true,
"selector": "abcdef1234ghijkl"
},
"dmarc": { "record": "v=DMARC1; p=none", "exists": true, "source": "exact", "domain": "example.com" },
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 52 }
}
AWS コンソールから確認する
AWS SES の場合は、AWS マネジメントコンソールの SES 設定画面からセレクタ名を確認できます。「Verified identities」でドメインを選択すると、DKIM の CNAME レコード 3 件が表示されます。CNAME のホスト名から ._domainkey.{ドメイン} を除いた部分がセレクタ名です。
AWS CLI でも確認できます。
aws ses get-identity-dkim-attributes --identities example.com
{
"DkimAttributes": {
"example.com": {
"DkimEnabled": true,
"DkimVerificationStatus": "Success",
"DkimTokens": [
"abcdef1234ghijkl",
"mnopqr5678stuvwx",
"yzabcd9012efghij"
]
}
}
}
DkimTokens の各値がセレクタ名に対応します。AWS SES の Easy DKIM は 3 つ の CNAME レコードを使用するため、トークンも 3 つ返ります。
確認の流れを整理する
セレクタの確認は、以下の順序で進めると効率的です。
利用しているメールサービスがわかっている場合は、命名規則表からセレクタ名を特定し、dig で直接確認します。1 つのドメインで Google Workspace と SendGrid を併用しているなら、google、s1、s2 の 3 つを確認すればカバーできます。
利用サービスが不明な場合は、API の auto モードで 18 種類のセレクタを一括検索します。matches 配列にヒットしたセレクタがあれば、そのプロバイダーの DKIM が有効です。
auto モードで見つからない場合は、対象ドメインから送られたメールのヘッダーを確認します。DKIM-Signature: s= フィールドからセレクタ名を取得し、explicit モードで再確認します。
"exhaustive": false が返っている以上、auto モードで "exists": false だったとしても DKIM が未設定とは断定できません。検知できなかったセレクタが存在する可能性を常に考慮してください。