独自ドメインのメール認証を確かめる|SPF・DKIM・DMARCをPowerShellで読む

独自ドメインを取ると、info@ドメイン のようなメールアドレスを作れます。ただ、そのメールがGmailなどで迷惑メールにされないためには、DNSに「このドメインのメールを送ってよいサーバー」などを書いておく必要があります。SPF・DKIM・DMARCと呼ばれる設定です。この記事では、Googleの送信者のガイドラインの要件を整理し、自分のドメインに設定があるかを、WindowsのPowerShellで読み取ります。

(確認:Google Workspace 管理者ヘルプ「メール送信者のガイドライン」。確認日:2026年10月22日。読み取りは、当サイト realine.net のDNSに対して、2026年10月22日にWindows 11のPowerShell 5.1で実行しました)

Googleのガイドラインの要件(個人用Gmailへ送る場合)

項目 すべての送信者 1日5,000件以上送る送信者
認証 SPF または DKIM SPF・DKIM・DMARC のすべて
DKIMの鍵 1,024ビット以上が必要。2,048ビットを推奨
送信元のIP 送信元のIPアドレスに、ホスト名を指すPTRレコード(逆引き)がある
迷惑メール率 Postmaster Toolsで報告される率を0.10%未満に保ち、0.30%以上にしない
登録解除 ― マーケティングのメールなどは、ワンクリックで登録解除できるようにする

個人や小さなサイトの問い合わせ用のメールなら、まず「すべての送信者」の列が対象です。メールマガジンなどで多く送る場合は、DMARCまで要ります。

3つの設定の役割

  • SPF:ドメインのTXTレコードに「v=spf1 …」と書き、メールを送ってよいサーバーを示す。1つのドメインにSPFのレコードは1つにする
  • DKIM:送るメールに電子署名を付け、受け取った側がDNSの公開鍵(「セレクタ名._domainkey.ドメイン」のTXT)で確かめる
  • DMARC:「_dmarc.ドメイン」のTXTに、SPFやDKIMで認証できなかったメールの扱い(p=none・quarantine・reject)と、レポートの送り先を書く

コード:DNSのレコードを読み取る

MX・SPF・DKIM・DMARCのレコードを、Resolve-DnsNameで読み取るPowerShellです。DKIMはセレクタ名が分からないと引けないため、引数で渡します(当サイトのメールサーバーでは「default」でした)。

# 独自ドメインのメール認証(MX・SPF・DKIM・DMARC)のDNSレコードを読み取る(読み取りのみ)
# 使い方: .\Get-MailAuth.ps1 -Domain example.com -Selector default
param([string]$Domain = 'realine.net', [string]$Selector = 'default')

function Get-Txt([string]$Name) {
    try {
        Resolve-DnsName -Name $Name -Type TXT -DnsOnly -ErrorAction Stop |
            Where-Object { $_.Type -eq 'TXT' } |
            ForEach-Object { ($_.Strings -join '') }
    } catch {
        @()   # レコードが無い場合(NXDOMAIN など)は空で返す
    }
}

Write-Output "ドメイン: $Domain"

# MX(このドメイン宛てのメールを受け取るサーバー)
try {
    $mx = Resolve-DnsName -Name $Domain -Type MX -DnsOnly -ErrorAction Stop | Where-Object { $_.Type -eq 'MX' }
    foreach ($r in ($mx | Sort-Object Preference)) { Write-Output ("MX    : 優先度 {0}  {1}" -f $r.Preference, $r.NameExchange) }
    if (-not $mx) { Write-Output 'MX    : なし' }
} catch {
    Write-Output 'MX    : なし'
}

# SPF(ドメインの直下の TXT のうち v=spf1 で始まるもの。1つだけが正しい形)
$spf = @(Get-Txt $Domain | Where-Object { $_ -like 'v=spf1*' })
if ($spf.Count -eq 0) { Write-Output 'SPF   : なし' }
foreach ($s in $spf) { Write-Output "SPF   : $s" }
if ($spf.Count -gt 1) { Write-Output 'SPF   : 注意 v=spf1 のレコードが複数ある' }

# DKIM(セレクタ._domainkey.ドメイン の TXT。セレクタ名はメールサーバーの設定画面で確かめる)
$dkim = @(Get-Txt "$Selector._domainkey.$Domain" | Where-Object { $_ -match 'p=' })
if ($dkim.Count -eq 0) { Write-Output "DKIM  : なし(セレクタ $Selector)" }
foreach ($k in $dkim) {
    if ($k -match 'p=([A-Za-z0-9+/=]+)') {
        $len = [Convert]::FromBase64String($Matches[1]).Length
        # 公開鍵(SubjectPublicKeyInfo)のバイト数から鍵の長さを見分ける
        $bits = @{ 162 = 1024; 294 = 2048 }[$len]
        if (-not $bits) { $bits = '不明' }
        Write-Output "DKIM  : あり(セレクタ $Selector、公開鍵 $len バイト=$bits ビット)"
    } else {
        Write-Output "DKIM  : 公開鍵が空(セレクタ $Selector は使われていない鍵)"
    }
}

# DMARC(_dmarc.ドメイン の TXT)
$dmarc = @(Get-Txt "_dmarc.$Domain" | Where-Object { $_ -like 'v=DMARC1*' })
if ($dmarc.Count -eq 0) { Write-Output 'DMARC : なし' }
foreach ($d in $dmarc) {
    Write-Output "DMARC : $d"
    if ($d -match 'p=(\w+)') { Write-Output "        ポリシー p=$($Matches[1])" }
}

実行の結果(realine.net)

ドメイン: realine.net
MX    : 優先度 0  realine.net
SPF   : v=spf1 +a:sv*****.xserver.jp +a:realine.net +mx include:spf.sender.xserver.jp ~all
DKIM  : あり(セレクタ default、公開鍵 294 バイト=2048 ビット)
DMARC : なし

(SPFの中のサーバー名の数字は伏せています)

  • SPFはあり、レンタルサーバーの送信サーバーを含める形(include:)で書かれていた
  • DKIMはセレクタ「default」で2,048ビットの公開鍵があり、Googleの推奨を満たしている
  • DMARCは無かった。Googleの要件では、1日5,000件未満なら「SPFまたはDKIM」で足りるが、なりすましの監視をするなら、DMARCも置いておく方がよい(筆者の考え)

無い時の始め方(筆者の考え)

  1. レンタルサーバーやメールサービスの管理画面で、SPFとDKIMを有効にする(多くはボタンで設定される。手で書く場合は、サービスが案内する値を使う)
  2. DMARCは、まず p=none(扱いは変えずにレポートだけ受け取る)で置き、レポートで自分のメールが認証に通っているかを見る
  3. 問題がなければ、quarantine・reject へ段階的に強める
  4. 設定の後、このスクリプトで、レコードが反映されたかを確かめる。反映されない時の調べ方はドメインが反映されない時の調べ方にあります

この記事で確かめていないこと

  • 当サイトのメールが、Gmailで実際に認証に通っているか(受信したメールのヘッダーは見ていない)
  • DMARCを置いた後のレポートの中身
  • Gmail以外(Outlook.comなど)の要件

まとめ

  • Gmailへ送るなら、すべての送信者にSPFかDKIMが要る。1日5,000件以上ならDMARCも要る
  • DKIMの鍵は1,024ビット以上、2,048ビットが推奨
  • 自分のドメインの設定は、PowerShellのResolve-DnsNameで読み取れる。当サイトはSPF・DKIMがあり、DMARCは無かった

本記事はGoogleの公開資料と、当サイトのDNSの読み取りにもとづく整理です。設定の値は、使っているメールサービスの案内に従ってください。ドメインの取り方は独自ドメインの取り方にまとめています。