このページの目次

SMTP

SMTP はインターネットで最も古いプロトコルの一つです。HELO から DATA、QUIT へと続き、メールは MTA 間でホップごとに転送されます。SPF/DKIM/DMARC の3層の「パッチ」は、SMTP の信頼モデル上に送信者検証を構築しようと試みています。

概要

SMTP はインターネットで最も古いプロトコルの一つ(1982年)であり、現在も世界中のメール転送の基盤となっています。TCP 接続上でシンプルなコマンド・レスポンスモデルを用いてメールを送信します。核心的な概念は、エンベロープ(MAIL FROM / RCPT TO)とヘッダー(From / To)の分離にあります。エンベロープはルーティングを決定し、ヘッダーはユーザーに表示されるものです。SPF は送信サーバーの IP を検証し、DKIM はメール内容に署名し、DMARC はそれらのポリシーを統一します。これら3つが連携して、スパムやドメインのなりすましを防ぎます。

SMTP セッションモデル

SMTP はコマンド・レスポンスモード(FTP に類似)を使用します。すべての転送は TCP 接続上で行われます。

S: 220 mail.example.com ESMTP Postfix
C: EHLO client.example.com          ← EHLO = 拡張 HELLO
S: 250-mail.example.com
S: 250-STARTTLS
S: 250-PIPELINING
S: 250-SIZE 52428800
S: 250 AUTH PLAIN LOGIN

C: STARTTLS                         ← TLS へアップグレード
S: 220 Ready to start TLS
(C: TLS ハンドシェイク)
C: EHLO client.example.com          ← STARTTLS 後の再 EHLO(新しいネゴシエーション)

C: AUTH PLAIN <base64(\0user\0pass)>  ← 認証
S: 235 2.7.0 Authentication successful

C: MAIL FROM:<sender@example.com>   ← envelope-from(リバウンドアドレス、SPF 検査対象)
S: 250 2.1.0 Ok
C: RCPT TO:<recipient@example.org>  ← envelope-to
S: 250 2.1.5 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: Sender <sender@example.com>  ← header-from(ユーザーに表示されるもの、DMARC アライメント対象)
C: To: Recipient <recipient@example.org>
C: Subject: Test
C: Date: Thu, 01 Jan 2025 00:00:00 +0000
C: Message-ID: <abc123@example.com>
C: 
C: Hello, World
C: .                                   ← 単一行の '.' で DATA を終了
S: 250 2.0.0 Ok: queued as 1A2B3C4D5E
C: QUIT
S: 221 2.0.0 Bye

エンベロープ vs ヘッダー

重要な違い:SMTP エンベロープ(MAIL FROM / RCPT TO)とメッセージヘッダー(From / To)は独立しています。SPF は envelope-from のドメインをチェックします。DMARC はアライメント(header From ドメイン == envelope-from ドメイン または DKIM ドメイン)を強制します。

SMTP ポート

25:   MTA↔MTA リレー(伝統的、現在クライアント用途ではほとんど使われない)
587:  Submission(クライアント → MSA、STARTTLS + AUTH が必須)
465:  SMTPS(TLS 上の SMTP、非標準だが広く使用されており、RFC 8314 で認知されている)

SPF

DNS: example.com TXT "v=spf1 ip4:192.0.2.0/24 include:_spf.google.com -all"

受信側 MTA:
  1. MAIL FROM ドメインの SPF レコードを検索
  2. 接続元の IP が SPF 承認リスト内にあるか検証
  3. 結果: Pass / Fail / SoftFail (~all) / Neutral (?all) / None (SPF なし)

  Fail かつ DMARC reject ポリシー → 拒否 (550 5.7.1 SPF failed)

DKIM

署名: MTA が秘密鍵を用いて、選択されたヘッダー (from, to, subject, date, message-id) および
      ボディハッシュ (SHA-256) に署名

DKIM-Signature ヘッダー:
  v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=default;
  h=from:to:subject:date:message-id;
  bh=<base64(SHA256(正規化されたボディ))>;
  b=<base64(RSA-SIGN(ヘッダーハッシュ + ボディハッシュ))>

DNS: default._domainkey.example.com TXT "v=DKIM1; k=rsa; p=<公開鍵>"

検証: MTA が p= を取得 → 署名を検証 → bh を比較 → OK

DMARC

DNS: _dmarc.example.com TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; pct=100"

検証:
  1. SPF アライメント: envelope-from ドメイン == header From ドメイン?(strict または relaxed)
  2. DKIM アライメント: d= ドメイン == header From ドメイン?(strict または relaxed)
  3. いずれかが pass → DMARC pass
  4. 両方が fail → ポリシーに従う: none(レポートのみ)、quarantine(スパムとしてマーク)、reject(拒否)

  rua: 集計レポート(毎日、XML 形式)
  ruf: リアルタイム失敗レポート(あまり使われない、プライバシー上の問題あり)
  pct: 適用割合(100 = 完全に適用)

参考

  • ツール⁠: swaks --to user@example.com --server mail.example.com --tls, dig TXT _dmarc.example.com
  • mxtoolbox.com for SPF/DKIM/DMARC validation

Keywords: SMTP, EHLO, envelope, STARTTLS, SPF, DKIM, DMARC, alignment, submission