【2024年対応】メルマガの「ワンクリック登録解除」をPHPで実装・手動運用する仕組みと注意点
- システム構築
2024年以降、GmailやYahoo!の送信者ガイドライン強化により、メルマガ配信において「ワンクリック登録解除(RFC 8058)」への対応が強く求められるようになりました。
SaaSの配信スタンドを使っていれば自動対応されますが、自前のシステムやPHPプログラムからメールを送信している場合、自身でヘッダーを組む必要があります。
この記事では、**「解除リクエストをプログラムで受け取り、管理者宛に通知メールを飛ばして、手動でリストから削除する」**という実務に即した運用フローを構築するための仕組みと実装方法を解説します。
ワンクリック登録解除の仕組み(図解)
ワンクリック登録解除は、メールの「本文」ではなく「メールヘッダー」の記述によって制御されます。読者がGmail上の「登録解除」ボタンを押した際、裏側で以下のような通信が行われます。
[読者]
│ (1) 登録解除ボタンをクリック
▼
[Gmail等のサーバー]
│ (2) ヘッダーのURLへPOST通信(裏側で実行)
│ ※この時、誰が押したか判別するためURLにパラメータ(?email=xxx)が必要
▼
[自社サーバー(unsubscribe.php)]
│ (3) POST通信を受信
├─▶ (4) 【システム内部処理】Gmailへ「200 OK(受付完了)」を返す
│
▼ (5) 管理者へ「解除依頼」の通知メールを送信
[管理者(あなた)]
(6) 通知メールを見て、手動で配信リストから対象者を削除

実装のキモ:メールヘッダーへの追記
ワンクリック解除を成立させるには、メール送信時に以下の2つのヘッダーを追加し、DKIM署名の対象に含める必要があります。
List-Unsubscribe: 解除用のURL(必須)と、予備のメールアドレス(推奨)を指定。List-Unsubscribe-Post: ワンクリック解除対応であることを宣言する固定値。
PHPでのヘッダー実装例
1回の送信処理で宛先($to)を1件ずつ処理するループ送信を想定したコードです。
// 送信先のメールアドレス(例:user@example.com)
$to = 'user@example.com';
// 1. 誰が解除したか分かるように、メールアドレスをURLエンコードしてパラメータに付与する
$encoded_email = urlencode($to);
$unsubscribe_url = "https://your-site.com/unsubscribe.php?email=" . $encoded_email;
// 2. 解除通知を受け取る管理者アドレス(Fromアドレスと別名でOKだが、ドメインは揃える)
$mailto_address = "admin@your-site.com";
// --- ヘッダーの組み立て ---
fputs($mp, "Content-Type: multipart/mixed; boundary=\"".$boundary."\"\n");
fputs($mp, "From: $from_name<$from>\n");
fputs($mp, "To: $to\n");
fputs($mp, "Subject: $subject\n");
// ここにワンクリック解除ヘッダーを追加
fputs($mp, "List-Unsubscribe: <$unsubscribe_url>, <mailto:$mailto_address?subject=Unsubscribe>\n");
fputs($mp, "List-Unsubscribe-Post: List-Unsubscribe=One-Click\n");
実運用でつまずきやすいポイント・Q&A
実装にあたり、仕様の勘違いが起きやすいポイントをまとめました。
Q. Gmail側から自動で「誰が解除したか(アドレス等)」を送ってくれる?
A. 送ってくれません。 Gmailはヘッダーに書かれたURLへ決められた合言葉(List-Unsubscribe=One-Click)をPOST送信するだけです。そのため、送信する段階で $unsubscribe_url の末尾に個別のメールアドレスやIDを組み込んでおく必要があります。BCCでの一括送信では個人を特定できなくなるため、1通ずつループして送る仕様が必須です。
Q. mailto: のアドレスは From と同じにするべき?
A. 一致させる必要はありませんが、ドメインは同じにすべきです。 From は読者からの通常返信用、mailto: はシステムからの解除通知用(admin@ など)と分けるのが運用上便利です。ただし、スパム判定を避けるため、@ 以降のドメインは From(自社ドメイン)と同じものを指定してください。
Q. mailto: 自体を省略してもいい?
A. はい、HTTPSのURLが1つあれば仕様上は問題ありません。 ただし、古いメールソフトのフォールバック(救済措置)として、mailto: も併記しておくのがベストプラクティスとされています。
Q. テスト送信したのにGmailに「登録解除」ボタンが出ない!
A. テスト環境では表示されないことが多々あります。 ボタンが表示される条件には「送信者の日頃の配信ボリューム(レピュテーション)」も影響します。数通のテスト送信や、自分宛て(同ドメイン間)の送信ではボタンが隠れる仕様です。メールの「ソースを表示」を確認し、ヘッダー内に List-Unsubscribe の2行が正しく出力されていれば実装は成功しています。
手動運用時の注意点 Googleのガイドラインでは「解除リクエストから2日以内」の処理完了が求められます。通知メールを受け取ったら、次回配信までに速やかにリストから削除する運用ルールを徹底しましょう。
