0
0

[Django] GmailとYahooメールが要求するワンクリック解除を実装する方法について

Posted at

概要

2024年の2月からGmailとYahooでは1日5000通以上のメールを送信する場合はワンクリックによるメール購読解除機能を実装することが求められるようになりました
実装する際は以下の情報をメールのヘッダに追加する必要があるのでその方法について解説していきます

List-Unsubscribe-Post: List-Unsubscribe=One-Click
List-Unsubscribe: <https://some-system.jp/unsubscribe/example>

前提

  • Djangoのプロジェクトを作成およびデプロイ済み
  • Djangoのプロジェクト内でメール送信設定が完了済み
  • AWS SESの設定が完了済み

実装

今回はDjangoのEmailMultiAlternativesクラスを使ってメールを送信します
EmailMultiAlternativesクラス内にヘッダを指定できるので以下のように記載します

emails.py
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string


def send_email(email):
    """メールを送信する

    Args:
        email (str): 送信先Eメール
        name (str): ユーザ名
    """
    plaintext = render_to_string(
        "send_email.txt",
    )

    msg = EmailMultiAlternatives(
        subject="テスト",
        body=plaintext,
        from_email="noreply@example.com",
        to=[email],
        headers={
            "List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
            "List-Unsubscribe": "<https://example.com>",
        },
    )

    # 送信
    msg.send()
django/core/mail/message.py
class EmailMultiAlternatives(EmailMessage):
    """
    A version of EmailMessage that makes it easy to send multipart/alternative
    messages. For example, including text and HTML versions of the text is
    made easier.
    """

    alternative_subtype = "alternative"

    def __init__(
        self,
        subject="",
        body="",
        from_email=None,
        to=None,
        bcc=None,
        connection=None,
        attachments=None,
        headers=None,
        alternatives=None,
        cc=None,
        reply_to=None,
    ):

実際に送信してみよう!

以下のように送信したメールにヘッダが表示されたら成功です

スクリーンショット 2024-07-20 21.07.20.png

登録解除リンクが表示されない場合は

登録解除リンクについてはGoogle側でドメインが信頼できるかどうかと一定数以上の購読者がいるかどうかを確認してから表示させる仕様だそうです

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0