メールマガジンをクリック一つで購読停止できるList-Unsubscribeの紹介

Gmailなどでメールマガジンを受け取った時に、購読停止できるリンクが表示されることがあります。あのような機能はList-Unsubscribeヘッダーによって実現できます。

f:id:moongift:20220119200925p:plain

今回はCustomers Mail Cloudを使ってList-Unsubscribeヘッダーを利用してみます。

List-Unsubscribeの仕組み

List-UnsubscribeはList-Unsubscribe-Postと一緒に使うのが一般的なようです。また、List-Unsubscribe-Postの値は List-Unsubscribe=One-Click 固定のようです。

List-UnsubscribeではメールアドレスまたはURLを指定できます。両方同時も可能です。たとえば以下のように指定します。URLの場合は <> で囲みます。メールの場合はmailto:を付けます。優先順位は前にあるもののようです。

List-Unsubscribe: <https://example.com/unsubscribe?id=99999999999>, <mailto:unsubscribe.99999999999@unsubscribe.example.com?subject=unsubscribe>
List-Unsubscribe-Post: List-Unsubscribe=One-Click

nodemailerでの送信例

nodemailerを使ってメール送信を行う際にはheadersパラメータで指定します。

const info = await transporter.sendMail({
    headers: {
        'List-Unsubscribe': '<https://example.com/unsubscribe?id=99999999999>, <mailto:unsubscribe.99999999999@unsubscribe.example.com?subject=unsubscribe>',
        'List-Unsubscribe-Post': 'List-Unsubscribe=One-Click',
    },
    from: 'Admin <example@smtps.jp>',
    to: 'user@example.com',
    subject: "メールマガジンのテスト",
    text: "Hello world?",
    html: "<b>Hello world?</b>",
});

これでメールを送信し、Gmail側で購読停止すると、迷惑メールに入れる確認ダイアログが出ます。

送信されるデータについて

URLの場合

URLの場合、指定されたURLに対してPOSTメソッドが送られてきます。クエリーストリングで対象を指定するIDを追加しておくのが良いでしょう。

メールの場合

メールの場合はCustomers Mail CloudのWebhookなどでメールを受け取るとURLにPOSTメソッドでリクエストが来ます。メール本文に次のように書かれています。

This message was automatically generated by Gmail.

後はユーザ名などにIDになる部分を適用すれば良さそうです。

まとめ

List-UnsubscribeはメールマガジンだけでなくGitHubリポジトリの購読など通知でも利用されています。ワンクリックで簡単にアクションできるので、ユーザビリティの高い仕組みです。ぜひ使ってみましょう。