Skip to content

SendGridのレガシーテンプレートからダイナミックテンプレートへの移行 #55

@fumikito

Description

@fumikito

概要

現在 hamail では、SendGrid の レガシーテンプレートを使用し、WordPress 投稿本文中の <%body%> をテンプレートに差し込むことで HTML メールを構築している。

この実装は将来的に非推奨となる可能性があり、以下の理由から ダイナミックテンプレートへの移行を検討したい:

  • SendGrid公式が推奨するのはダイナミックテンプレートであり、今後の機能追加もこちらに集中している
  • setAsm() 等の高度なパーソナライズ機能がレガシーでは不安定
  • Handlebars によるテンプレート構築で構造が明確になる
  • プレースホルダーによるパーソナライズを WordPress 上で柔軟に定義可能

現状の問題点

  • レガシーテンプレートでは -name- 等の独自プレースホルダーを addSubstitution() によって置き換えている
  • <%body%> に全文が差し込まれる構成のため、テンプレート管理がしにくい
  • ASM(配信停止グループ)や click/open tracking などとの互換性に問題がある場合がある

実装方針(案)

  1. SendGrid ダッシュボード上で、以下のようなダイナミックテンプレートを作成:

    <html>
      <body>
        {{{body}}}
        <p><a href="{{unsubscribe}}">配信停止</a></p>
      </body>
    </html>
  2. WordPress 投稿本文($post->post_content)には Handlebars 構文の変数を含める形式に変更:

    {{name}} 様
    
    あなたの最近公開した作品 {{latest_work}} が人気です。
    アクセス解析はこちら → {{author_stats}}
    
  3. PHP側の送信処理で以下のように addDynamicTemplateData() を使って変数を渡す:

    $mail->setTemplateId('d-xxxxxxxx...');
    $mail->addDynamicTemplateData('body', $post->post_content);
    $mail->addDynamicTemplateData('name', $recipient['name']);
    $mail->addDynamicTemplateData('latest_work', $recipient['latest_work']);
    $mail->addDynamicTemplateData('author_stats', $recipient['author_stats']);

移行のメリット

  • SendGridの推奨方式に準拠
  • プレースホルダーの再利用性・テンプレートの可読性向上
  • WordPress内での「テンプレートとしての本文編集」が可能に(=投稿画面で変数を直接記述できる)

影響範囲

  • 送信テンプレートIDの管理方式(固定IDをオプションで指定?)
  • addSubstitution() に依存しているコード全般
  • HTML出力時の str_replace ベースのテンプレート構築ロジック

残課題

  • エスケープ処理の整理({{{body}}} を使うことで非エスケープ出力だが、XSS には注意)
  • 現在の設定画面との整合性
  • 移行時の互換モードの要否(旧テンプレートも残す?)

備考

SendGrid 公式ドキュメント:
📘 https://docs.sendgrid.com/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates

Metadata

Metadata

Assignees

Labels

DesignDesign and WordPress editor related.Mail APIFeature

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions