List-Unsubscribe
概要
List-Unsubscribe は、メールヘッダーに記載する購読解除用の情報です。RFC 2369(1998年)で List-Unsubscribe ヘッダーとして定義され、RFC 8058(2017年)で List-Unsubscribe-Post ヘッダーと組み合わせたワンクリック購読解除の仕組みが追加されました。
受信者はメールを開いて購読解除リンクを探す代わりに、メールクライアントの「購読解除」ボタンから直接配信を停止できます。Gmail、Outlook.com、Yahoo Mail などの主要メールクライアントは、List-Unsubscribe ヘッダーを検出すると受信トレイの上部に購読解除ボタンを表示します。
Google は 2024 年 2 月以降、1 日 5,000 通以上を送信するバルクセンダーに対してワンクリック購読解除の実装を義務化しています。Gmail の要件では、List-Unsubscribe ヘッダーに HTTPS の URL を含め、ワンクリックで解除が完了する仕組みが求められています。購読解除の手段を提供することでスパム報告を減らし、送信者レピュテーションを維持する効果があります。
仕組み
List-Unsubscribe は購読解除の経路を 3 種(mailto、HTTPS、one-click POST)提供し、受信者の利便性と配信品質の双方を向上させます。
List-Unsubscribe ヘッダーの書式
List-Unsubscribe ヘッダーには、購読解除の手段を角括弧で囲んで URL または mailto で指定します。
List-Unsubscribe: <https://example.com/unsubscribe?id=abc123>
複数の手段を併記する場合はカンマで区切ります。
List-Unsubscribe: <https://example.com/unsubscribe?id=abc123>,
<mailto:unsubscribe@example.com?subject=unsubscribe>
メールクライアントは List-Unsubscribe ヘッダーを検出すると、受信トレイの上部またはメールの本文付近に「購読解除」ボタンを表示します。ユーザーがこのボタンをクリックした際の動作は、List-Unsubscribe-Post ヘッダーの有無で変わります。
ワンクリック購読解除(RFC 8058)
RFC 8058 は、ユーザーの操作なしで購読解除を完了させる仕組みを定めています。List-Unsubscribe-Post ヘッダーに List-Unsubscribe=One-Click を指定すると、メールクライアントはユーザーが購読解除ボタンをクリックした時点で直ちに HTTPS POST リクエストを送信します。
List-Unsubscribe: <https://example.com/unsubscribe?id=abc123>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
ワンクリック解除のフローは次の通りです。
sequenceDiagram
participant U as 受信者
participant M as メールクライアント
participant S as 送信者サーバー
Note over M: List-Unsubscribe +<br/>List-Unsubscribe-Post を検出
M->>U: 購読解除ボタンを表示
U->>M: ボタンをクリック
M->>S: POST https://example.com/unsubscribe?id=abc123
S-->>M: HTTP 200
Note over M: 購読解除完了
- メールクライアントが
List-UnsubscribeとList-Unsubscribe-Postヘッダーを検出する - ユーザーが「購読解除」ボタンをクリックする
- メールクライアントが
List-Unsubscribeの HTTPS URL に POST リクエストを送信する - サーバーが購読解除を処理し、HTTP 200 を返す
- 購読解除が完了する
List-Unsubscribe-Post ヘッダーがない場合、メールクライアントは購読解除の確認ページをブラウザーで開くか、メールクライアントで解除メールを作成します。ワンクリック解除に比べてユーザーの手間が増えます。
mailto による購読解除
mailto: スキームを指定すると、メールクライアントは購読解除メールの作成画面を開きます。
List-Unsubscribe: <mailto:unsubscribe@example.com?subject=unsubscribe>
ユーザーが送信ボタンを押さなければ購読解除が完了しないため、ワンクリック解除に比べて完了率が下がります。Gmail の 2024 年の要件では、mailto: のみの List-Unsubscribe はワンクリック解除の要件を満たしません。mailto: と併記する場合は HTTPS URL を含める必要があります。
Gmail の要件
Google がバルクセンダーに義務化している購読解除の要件は次の通りです。
List-Unsubscribeヘッダーに HTTPS の URL を含める- ワンクリックで購読解除が完了すること(確認ページやログインなし)
- 購読解除の処理を 48 時間以内に行う
- 1 日 5,000 通以上を送信するセンダーが対象
これらの要件を満たさない場合、Gmail はメールを迷惑メールフォルダに振り分ける可能性が高くなります。
設定例
メールヘッダーに List-Unsubscribe を設定する例を示します。
ワンクリック購読解除(推奨)
Gmail の要件を満たすワンクリック解除のヘッダー設定です。
List-Unsubscribe: <https://example.com/unsubscribe?id=abc123>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
サーバー側は、HTTPS POST リクエストを受け取ったら購読解除を処理し、HTTP 200 を返します。ユーザーのログインや確認ページへの遷移を求めてはなりません。
HTTPS + mailto の併記
ワンクリック解除に対応しない古いメールクライアント用に mailto も併記する例です。
List-Unsubscribe: <https://example.com/unsubscribe?id=abc123>,
<mailto:unsubscribe@example.com?subject=unsubscribe%20abc123>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
SendGrid を使った設定例
SendGrid などのメール配信サービスでは、API のヘッダー設定で List-Unsubscribe を指定します。
{
"personalizations": [
{
"to": [{"email": "user@example.net"}]
}
],
"from": {"email": "newsletter@example.com"},
"subject": "Monthly Update",
"headers": {
"List-Unsubscribe": "<https://example.com/unsubscribe?id=abc123>",
"List-Unsubscribe-Post": "List-Unsubscribe=One-Click"
}
}
SendGrid は独自の購読解除機能(Subscription Tracking)も提供していますが、ワンクリック解除に対応させるには送信側でヘッダーを設定する必要があります。
確認方法
送信したメールに List-Unsubscribe ヘッダーが正しく設定されているかを確認します。
メールヘッダーの確認
受け取ったメールのヘッダー情報を表示します。Gmail では「その他」→「メッセージのソースを表示」から確認できます。
List-Unsubscribe: <https://example.com/unsubscribe?id=abc123>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
List-Unsubscribe ヘッダーに HTTPS URL が含まれていれば、メールクライアントに購読解除ボタンが表示されます。List-Unsubscribe-Post も設定されていれば、ワンクリック解除が有効です。
DNS レコードの確認
送信ドメインの認証設定が整っているかを dig で確認します。SPF と DKIM が正しく設定されていないと、メールクライアントが List-Unsubscribe ヘッダーの信頼性を検証できず、購読解除ボタンを表示しないことがあります。
dig TXT example.com
;; ANSWER SECTION:
example.com. 3600 IN TXT "v=spf1 include:_spf.google.com ~all"
外部の視点からも確認したい場合は、Labee Dev Toolbox の Mail Auth API を使います。
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"],
"exhaustive": false
},
"dmarc": { "record": "v=DMARC1; p=reject; rua=mailto:dmarc@example.com", "exists": true, "source": "exact", "domain": "example.com" },
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 98 }
}
SPF と DKIM が正しく設定されていれば、List-Unsubscribe のワンクリック解除も問題なく機能します。DKIM 署名がない場合、メールクライアントが List-Unsubscribe ヘッダーの信頼性を検証できず、購読解除ボタンを表示しないことがあります。
ワンクリック解除のテスト
自社ドメインのテストアドレスにメールを送信し、Gmail で購読解除ボタンが表示されるかを確認します。ボタンをクリックして、サーバー側で POST リクエストを受信でき、HTTP 200 を返すことを検証します。
よくある問題
List-Unsubscribe の実装で頻出するのは、ワンクリック解除の非対応、解除処理の遅延、解除の確認ログインです。
mailto のみでワンクリック解除に対応していない
List-Unsubscribe ヘッダーに mailto: しか含めていない場合、Gmail のバルクセンダー要件を満たしません。Gmail は HTTPS URL を含むワンクリック解除の実装を求めています。mailto: を併記する場合は必ず HTTPS URL も含めます。
購読解除後にログインを求める
ワンクリック解除の HTTPS POST リクエストを受け取った後、ログインページにリダイレクトしたり、確認ページを表示したりすると、RFC 8058 の要件に反します。POST リクエストを受信した時点で購読解除を完了し、HTTP 200 を返します。ユーザーに追加の操作を求めてはなりません。
購読解除の処理が 48 時間を超える
Gmail の要件では、購読解除の処理を 48 時間以内に行うことを求めています。購読解除リクエストをキューに溜めて後で処理する設計の場合、処理の遅延が 48 時間を超えないようにします。即時処理が最も確実です。
購読解除 URL が推測可能でセキュリティリスクがある
URL にユーザー ID を平文で含めると、他のユーザーの購読解除が推測可能になります。https://example.com/unsubscribe?user=1234 のような URL は、user=1235 に変更するだけで他人の購読解除が可能です。URL には推測困難なトークン(HMAC やランダム文字列)を使用します。
推測可能な URL(避ける):
List-Unsubscribe: <https://example.com/unsubscribe?user=1234>
推測困難な URL(推奨):
List-Unsubscribe: <https://example.com/unsubscribe?id=a1b2c3d4e5f6>
トークンは HMAC で署名するか、データベースにランダムなハッシュを紐付けて管理します。