この記事は「エンジニアが知っておくべき メール送信・運用ノウハウ、メールの認証技術やセキュリティについて投稿しよう! by blastengine Advent Calendar 2025」の記事として、メール送信の“実装”と“運用”を一体で設計するための実戦ノウハウをまとめています。
先に結論
メール送信の成功は「SMTPで投げた」ではなく、受信側で“通る条件”を満たし、運用で“崩れない状態”を維持できるかで決まります。
最低限、次を“設計→実装→運用”で揃えると、到達率もセキュリティも一気に安定します。
- SPF / DKIM / DMARC を揃える(ただし「設定した」だけで終わらせない)
- DMARC alignment(FromドメインとSPF/DKIMの整合)を最初から設計する
- Bulk送信の世界では ワンクリック配信停止(List-Unsubscribe + List-Unsubscribe-Post) が前提
- スパム率/苦情率/バウンス率を監視し、リスト衛生と抑止(suppression)を自動化
- 認証・レピュテーション・セキュリティ(資格情報漏洩等) を「事故対応」ではなく「予防設計」にする
なぜ「届く/届かない」が難しいのか
メールは、HTTPのように「1リクエスト=1結果」ではありません。
アプリが送ったあとに、受信側が複数の観点で評価します。
- 認証(SPF / DKIM / DMARC)
- インフラ健全性(TLS、逆引きDNS、HELO整合など)
- レピュテーション(IP / ドメイン)
- コンテンツ・振る舞い(苦情率、配信停止のしやすさ、宛先品質)
そして落とし穴の代表が、“エンベロープ(SMTP)”と“ヘッダ(メール本文)”が別物なことです。
┌─────────────────────────────────────┐
│ アプリが作るメール(RFC 5322ヘッダ+本文) │
│ From: support@example.com │ ← DMARCの基準はここ(Header From)
│ To: user@example.net │
│ Subject: ... │
│ ... │
└─────────────────────────────────────┘
▲
│(SMTPで包む)
▼
┌─────────────────────────────────────┐
│ SMTPエンベロープ(配送用の外袋) │
│ MAIL FROM:<bounce@bounces.example.com> ← SPFの評価対象になりやすい(Return-Path)
│ RCPT TO:<user@example.net> │
└─────────────────────────────────────┘
ここが理解できると、次の“事故あるある”が消えます。
- SPFは通っているのにDMARCに落ちる
- 送信サービスを変えたら突然迷惑メール判定が増えた
- メルマガとトランザクションが同じドメインで燃えた
メール認証は「通す」より「運用する」が9割
SPF:正しく“送信元を列挙”できていますか
SPFは「このドメインから送っていい送信元(IPやinclude)をDNSで宣言する」仕組みです。
SPFの設計で守るべき原則
- “送る可能性がある全て”を列挙する (一部が漏れると、その経路が迷惑メール化しやすい)
-
-all(Fail)か~all(SoftFail)を選ぶ
最初は~allで始め、全送信元が揃ったら-allへ、が堅実です - SPFはDNS参照回数に制限があるため、
include:を増やしすぎない(運用で破綻しがち)
例:基本形(※そのまま使わず、自社の送信元に合わせてください)
example.com. TXT "v=spf1 ip4:203.0.113.10 include:_spf.provider.example ~all"
ポイント:“どの送信”がこのSPFで担保されるかを一覧化し、SaaS追加や経路追加のたびに更新する運用を作ることが重要です。
DKIM:署名できても“壊れた署名”は意味がない
DKIMは「メールの一部(ヘッダ+本文)に署名して、改ざんされていないことを示す」仕組みです。
DKIMが運用で壊れる典型
- 中継やゲートウェイが 本文末尾にフッタを付ける(署名が壊れる)
-
List-Unsubscribe等のヘッダが 後から追加される(署名対象に入っていない) - 署名鍵の更新(selector変更)で DNS反映漏れ が起きる
DKIM運用のコツ(現場で効きます)
-
selectorをローテーション前提で設計する(
s=2025a→s=2025bのように) - 「後から変わる可能性があるヘッダ」を、署名の対象に入れる/入れないを決める
Bulk運用では List-Unsubscribe 系ヘッダを署名対象に含める設計が安全です(後述) - 鍵長は“要件を満たす”だけでなく、将来の運用変更を見越して選ぶ
例:DKIM DNSレコード(公開鍵)
2025a._domainkey.example.com. TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq...(省略)"
DMARC:alignment(整合)を理解すると事故が減る
DMARCは「Fromに書かれたドメインを、受信側が信頼してよいか」を判断する“まとめ役”です。
DMARCの肝は、次の2点です。
- SPFまたはDKIMのどちらか(または両方)がPassする
- そのうえで、Header From のドメインと“整合(alignment)”している
alignment を一枚絵で理解する
Header From: support@example.com
SPF domain: bounces.example.com ← MAIL FROM / Return-Path のドメイン
DKIM d=: example.com ← DKIM署名のドメイン
DMARC Pass には、
- SPF Pass か DKIM Pass が必要
- さらに Header From(example.com)と SPF domain または DKIM d= が整合している必要がある
ここを曖昧にしたまま送信基盤を変えると、突然DMARC落ちします。
DMARCは「段階的に強くする」が基本
いきなり p=reject にすると、正規メールまで落ちる事故が起きます。
おすすめはこの順番です。
-
p=none(レポート収集) -
p=quarantine(徐々に隔離) -
p=reject(なりすましを強く拒否)
例:最初のDMARC(レポート収集)
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc-rua@example.com; adkim=r; aspf=r; pct=100"
rua(集計レポート)を受け取れる体制を作ると、“自社を騙る送信” も早期に見つけられます。
2025年の送信要件:Bulk Sender前提で設計する
受信側の要件は年々厳しくなっています。特に大きいのは「一定量以上送る送信者(Bulk Sender)」の扱いです。
- 一定以上の送信量があると、認証・配信停止・スパム率などが強く求められます
- 送信量の定義が“ドメイン単位”で集計されるケースがあるため、サブドメイン分割の設計が重要です
重要:要件は変更され得ます。必ず各社の最新ガイドラインを確認してください(リンクは末尾にまとめます)。
ワンクリック配信停止(RFC 8058)を“実装で”落とさない
Bulk運用で見落としやすいのが、 List-Unsubscribe の“形式要件” です。
ポイントは2つです。
-
List-Unsubscribeに HTTPS URL を含める -
List-Unsubscribe-Post: List-Unsubscribe=One-Clickを付ける(ワンクリックの合図) - そして実務上は、この2つのヘッダがDKIM署名で保護される設計が安全です(途中で書き換わると壊れるため)
例:ヘッダ実装(購読型・メルマガ向け)
List-Unsubscribe: <https://example.com/unsub?token=...>, <mailto:unsubscribe@example.com>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
「ワンクリックURL」のサーバ実装で守ること
- トークンは 受信者と配信リストを一意に特定 できること
- URLは ログイン不要で完結 すること(クリック→完了が理想)
- CSRFや推測耐性のために、トークンは 十分に長いランダム値 にすること
- 受信側がPOSTしてくるケースがあるため、POSTを受けられる こと
バウンス/苦情/配信停止を“プロダクト品質”にする
「届かない」には必ず理由があります。運用で重要なのは、理由を分類し、再発防止の仕組みに落とすことです。
まずイベントを正しく分ける
- Deferred(4xx):一時的失敗(混雑・レート制限など)
- Bounced(5xx):恒久的失敗(宛先不明など)
- Complaint:ユーザが迷惑メール報告
- Unsubscribe:配信停止(List-Unsubscribe等)
この4つを混ぜると、やるべき対処が分からなくなります。
DSNコード(例)と“基本アクション”
| 代表例 | 意味(ざっくり) | 推奨アクション |
|---|---|---|
| 5.1.1 | ユーザ不明 | 即サプレッション(以後送らない) |
| 5.2.2 | 容量不足 | しばらく待って再送/回数制限 |
| 4.xx | 一時失敗 | リトライ(指数バックオフ)+監視 |
| 5.7.x | ポリシー・認証系 | 認証・整合・内容・レピュテーションの点検 |
“一時失敗”を延々と再送し続けると、レピュテーションを落とします。リトライ上限と抑止ルールが必要です。
セキュリティ事故を防ぐ:漏洩・なりすまし・改ざんの現実的対策
メール送信は便利ですが、攻撃者にも便利です。現場で多い事故はこの3つです。
1) SMTP/API資格情報の漏洩(最も多い)
対策は「精神論」ではなく、設計で事故の半径を小さくすることです。
- 資格情報を 環境別(dev/stg/prod) に分ける
- アプリごとにキーを分け、権限を最小化する
- 送信元(From / Return-Path)を 許可リストで縛る(可能なら)
- 送信数の急増を検知する(1分あたり・1時間あたり)
- 漏洩を疑ったら 即ローテーションできる運用を作る(手順化)
2) ヘッダインジェクション(改行混入)
ユーザ入力をSubjectやFrom表示名に入れるとき、改行 \r\n が混ざるとヘッダが壊れたり、悪用されます。
- メール生成は 信頼できるライブラリを使う
- ヘッダに入れる文字列は 改行や制御文字を除去する
例:最低限のサニタイズ(概念例)
function sanitizeHeaderValue(s) {
return String(s).replace(/[\r\n\0]/g, " ").trim();
}
3) なりすまし(自社ドメインが騙られる)
ここで効くのが DMARCを段階的に強化して最終的にrejectへ です。
「自社から送っていないのにFromが自社」を減らせると、フィッシング被害も問い合わせも減ります。
監視とインシデント対応:落ちたときに最短で戻す手順
メールは「落ちてから」だと原因が多すぎて迷子になります。
最初から、最低限この監視を入れると復旧が速くなります。
監視ダッシュボード(最小セット)
- 送信数(分・時・日)
- 成功(accepted / delivered)
- 失敗(deferred / bounced)
- 4xx と 5xx を分ける
- 苦情(complaint)
- 配信停止(unsubscribe)
- DMARCレポートの異常(未知の送信元増加など)
まず見るべき「Authentication-Results」
到達が落ちたら、まず受信メールのヘッダでこれを見ます。
- SPF / DKIM / DMARC が pass しているか
- Header From と整合しているか
例:ヘッダ(イメージ)
Authentication-Results: mx.example.net;
spf=pass smtp.mailfrom=bounces.example.com;
dkim=pass header.d=example.com;
dmarc=pass header.from=example.com
これが dmarc=fail のとき、ほぼ必ず alignmentの設計漏れか 送信経路追加の反映漏れです。
自前運用 vs 配信サービス:どこまで持つべきか
メール配信は、やることが多いわりに 本業の差別化になりにくい領域でもあります。
判断を楽にするため、責務を分けて考えます。
自前で持つと重い責務(代表例)
- IPレピュテーション管理
- バウンス処理・抑止リスト運用
- 受信側仕様変更への追従(要件強化)
- ブラックリスト監視
- レート制限・スパム率監視と改善
このあたりを、SMTPリレーやメール配信APIを提供するサービスに委譲できると、アプリ側は「誰に何を送るか」へ集中できます。
blastengineのようなメール配信基盤は、SMTPリレーやAPI連携に加え、運用負荷の高い領域(バウンス処理や監視など)をサービス側で担う選択肢になり得ます(採用の可否は要件次第です)。
チェックリスト(そのまま使える)
リリース前チェック(必須)
- Fromドメインの設計(トランザクションとメルマガを分けるか)
- SPF:全送信経路が含まれている(漏れがない)
- DKIM:署名が壊れない経路になっている(中継の改変有無)
- DMARC:p=none でまずレポート収集できる
- DMARC alignment:Header From と SPF/DKIM の整合が設計されている
- TLS:送信経路でTLSが有効(可能なら強制も検討)
- 配信停止:メルマガはワンクリック配信停止(List-Unsubscribe / Post)
- バウンス:5xxは抑止、4xxは上限付きリトライ
- 送信爆発:急増アラート(資格情報漏洩の早期検知)
- ログ:Message-ID と送信イベントが追える
月次運用チェック(おすすめ)
- SPF/DKIM/DMARCレコードに変更がないか(SaaS追加時に破綻しやすい)
- DMARCレポートで未知の送信元が増えていないか
- バウンス率・苦情率の悪化がないか
- 配信停止の導線が壊れていないか(リンク切れなど)
- 送信量の増減(キャンペーン時に温めが必要なケースあり)
参考リンク
仕様・要件は更新され得ます。必ず最新の公式情報をご確認ください。
-
Google: Email sender guidelines / FAQ
-
Microsoft: Outlook.com(consumer)高ボリューム送信者向け要件
https://learn.microsoft.com/en-us/outlook/high-volume-senders -
RFC 5322(メール形式)
https://www.rfc-editor.org/rfc/rfc5322 -
RFC 7208(SPF)
https://www.rfc-editor.org/rfc/rfc7208 -
RFC 6376(DKIM)
https://www.rfc-editor.org/rfc/rfc6376 -
RFC 7489(DMARC)
https://www.rfc-editor.org/rfc/rfc7489 -
RFC 8058(One-Click List-Unsubscribe)
https://www.rfc-editor.org/rfc/rfc8058 -
RFC 8461(MTA-STS)
https://www.rfc-editor.org/rfc/rfc8461 -
RFC 8460(SMTP TLS Reporting / TLS-RPT)
https://www.rfc-editor.org/rfc/rfc8460
おわりに
メールは「送れたら終わり」ではなく、届くまでがプロダクトです。
SPF/DKIM/DMARCはスタートラインで、勝負はその後の 運用設計(監視・抑止・変更追従・事故対応) で決まります。