開発・技術選定

送ったメールが届かない — SPF / DKIM / DMARC を設定する

「登録完了メールが届かない」という問い合わせは、
アプリのバグではなく 送信ドメイン認証の未設定が原因のことがほとんどです。

なぜ届かないのか

受信側は「このメールは本当にそのドメインから送られたか」を検証します。
検証できないメールは、迷惑メール扱いか、そもそも受け取り拒否されます。

実際に返ってくるエラーはこういう形です。

550 5.7.26 Your email has been blocked because the sender is
unauthenticated. ... SPF [example.jp] = did not pass, DKIM = did not pass

SPF も DKIM も設定されていない、と明示されています。

SPF — 「どのサーバーから送るか」の宣言

DNS の TXT レコードで、送信を許可するサーバーを宣言します。

種別: TXT   名前: @(ドメイン自体)
値:   v=spf1 include:_spf.google.com ~all
  • include: … 利用しているメールサービスの指定(各社が公開しています)
  • ~all … それ以外は「疑わしい」扱い(-all にすると完全拒否)

SPFレコードは1ドメインに1つだけです。複数書くと全体が無効になります。
複数のサービスを使う場合は、1行に include: を並べます。

v=spf1 include:_spf.google.com include:sendgrid.net ~all

DKIM — 「改ざんされていない」の署名

送信側が秘密鍵で署名し、受信側が DNS 上の公開鍵で検証します。
鍵はメールサービス側の管理画面で生成し、出てきた値を DNS に登録します。

種別: TXT   名前: <セレクタ>._domainkey
値:   v=DKIM1; k=rsa; p=MIIBIjANBg...(長い公開鍵)

登録後、サービス側で「認証を開始」する操作が別途必要なことが多いです。
DNS に置いただけでは署名が始まらないので、ここを見落としがちです。

DMARC — 検証に失敗したときの扱いを指示

種別: TXT   名前: _dmarc
値:   v=DMARC1; p=none; rua=mailto:postmaster@example.jp

最初は必ず p=none(何もしないが報告は受ける)から始めます。
いきなり p=reject にすると、設定漏れがあった瞬間に正規のメールまで消えます

レポートを見て問題が無いことを確認してから、quarantinereject と段階的に上げます。

設定できているかの確認

dig +short TXT example.jp | grep spf
dig +short TXT selector._domainkey.example.jp
dig +short TXT _dmarc.example.jp

実際に送って確認する場合、Gmail なら受信メールの
「メッセージのソースを表示」で次を見ます。

spf=pass       (google.com: domain of ... designates ...)
dkim=pass      header.i=@example.jp
dmarc=pass

3つとも pass になっていれば完了です。

その他の落とし穴

  • DNS の反映待ち … 数分〜数時間かかる。すぐに諦めない
  • 差出人アドレスの不一致 … 認証したドメイン以外を From にすると、書き換えられるか弾かれる
  • 共有IPの評判 … 安価な送信サービスは、他利用者の影響を受けることがある

まとめ

レコード 役割 最初の設定
SPF 送信元サーバーの宣言 v=spf1 include:... ~all
DKIM 署名による改ざん検知 サービス側で鍵生成 → DNS 登録 → 有効化
DMARC 失敗時の扱いの指示 p=none から始める

この3つを入れるだけで、到達率は劇的に変わります。
サービス公開前に必ず設定しておくべき項目です。