Salesforce Marketing Cloudでメールの件名を動的に変更してメール送信する方法

こんちには！
LIFULLエンジニアの吉永です。

本日はSalesforce Marketing Cloud（以降SFMCと略します）でメールの件名を動的に変更してメール送信する方法について解説します。
件名はメール開封率に関わる重要な要素であり、昨今ではユーザー毎にパーソナライズされた件名のメールを出す企業やサービスも増えてきているので、SFMCで送るメールでどのようにして動的な件名のメールを送るのかを見ていきましょう。

## SFMCで件名を動的に変更する手法について調査第一弾

そもそも、何故この記事を執筆しているかというと、SFMCで件名を動的に変更する手法を調査した際に色々な情報が出てきて混乱したという背景があります。

まずSFMCでメールを送るには、Content Builderでメールコンテンツを作成し、Journey Builderに組み込みます。
※Automation StudioやEmail Studioからもメールは送れますが、ここでは一番利用頻度が多いと思われる手法で解説します。

件名はContent Builderで作成する際にも設定しますが、Journey BuilderでもA/Bテストがしやすいようにという配慮からなのか、Content Builderで設定した件名を上書きしてメール送信することが可能です。

今回躓いた点はここでして、私は当初動的な件名変更はJourney Builderですると思い調査しました。
調査した中で行きついたページは下記です。

https://help.salesforce.com/s/articleView?id=sf.mc_ceb_create_dynamic_subjectline_preheader.htm&type=5


上記ページを見ると、AMPScriptの変数展開式である`%%hoge%%`を使用して、件名をユーザー毎に変更できると解説されています。
この変数が、Journey Builderの連絡先であるデータエクステンション内にあるカラム名か、購読者情報に含まれるカラムのいずれかである必要があるようで、例えばSSJSで設定した変数を読み込んだりできないのか？と思い色々試行錯誤しましたが、存在しない値を参照しているとJourney Builderの検証でエラーが表示されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690018/3bf7a731-52e6-0784-abfd-d6fa42356eee.png)

ということで、SSJSで設定した変数は使えず、動的な件名の元になる情報をJourney Builderの連絡先となるデータエクステンションのカラムに含めておく必要があるんだなと、この時点では一旦調査を終了していました。

ちなみにContent Builderでも似たようなヘルプページはあり、Journey Builderと同じようなことができるようでした。

https://help.salesforce.com/s/articleView?id=sf.mc_es_create_content_builder_email.htm&type=5

## SFMCで件名を動的に変更する手法について調査第二弾

後日、いよいよ件名を動的に変更する案件が具体化してきたので、詳細な設計を行う必要があり念の為、再調査を行いました。
再調査をした理由としては、動的に変更する件名の要素を外部APIサーバーから取得する必要があり、APIサーバーへの負荷が配信リストを生成する際に集中してしまう懸念があったからです。

Journey BuilderにはEinstein STOという、ユーザー毎に最適化された時間帯にメールを送信するようにメール送信アクティビティを待機させる機能があるのですが、既存のメール送信ではEinstein STOで自然とAPIサーバーへのアクセスがばらけ、負荷分散できていたところを、件名を動的に対応させるが故にアクセスが集中してしまうことをなんとか回避できないか？という思いからもう一度まっさらな状態から調査したところ、下記のページに行きつきました。

https://salesforce.stackexchange.com/questions/166950/sfmc-ampscript-subject-line-in-automation-from-content-builder

上記によると、件名欄に`%%=v(@Subject)=%%`を入力し、下記のようなコードをAMPScriptで書けば件名をスクリプト側でコントロールできると記載されていました。

```
%%[
VAR @Subject,@Date,@Name
SET @Date = FORMAT(DateAdd(Now(), "X","D"), "MMMM dd, yyyy")
SET @Name = Lookup("Customers","Name","SubscriberKey",_subscriberkey)
SET @Subject = Concat('Hi ',@Name,',The date is: ',@Date)
]%%
```

この手法なら配信リストであるデータエクステンションのカラムを増やすことなく、かつEinstein STOで自然と負荷分散された状態で動的な件名をSSJS側で設定できそうだなということで、設計を行い、最終的には下記のような設定で実現できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690018/29f31d93-d38b-d383-cd09-02190e6281ec.png)

上記では以前投稿した[記事](https://qiita.com/YoshinagaYuta/items/e069450c1f6914398a47)でテスト用に作成したAMP for Emailの件名をスクリプト側で設定している例です。

件名欄には先ほど紹介したコミュニティページの回答どおりの`%%=v(@Subject)=%%`を入力し、メール本文内には下記のスクリプトを追記します。

```
<script runat="server">
  Platform.Load("core", "1");
  Variable.SetValue("@Subject", "Hello AMP for Email");
</script>
```

このようにすることで、Journey Builderの検証でもエラーにならず、かつ送信時にスクリプト側で件名を制御しての動的件名に対応したメールを実現することが可能となりました。

そもそも、第一弾の調査で行っていたのは連絡先の変数展開であり、SSJSやAMPScriptで設定した変数を読み込む際は`%%=v(@hoge)=%%`の形式にする必要があるということを失念していたことが原因でした。

## まとめ

いかがでしたでしょうか？
今回はSFMCで動的な件名のメールを送信する為の設定手順をご紹介しました。

SFMCでは件名を変更する手段が色々と提供されている為、どの手段を用いるかで微妙にアプローチが変わることが少々ややこしいですが、プログラムで件名を制御できることが分かって一安心しました。
※もともとデータエクステンションのカラム経由でしかできなそうと第一弾の調査で結論付けた時にも、ほんとか？と多少疑問は抱いてましたが

SFMCはググってもあまり情報が出てこないので、また何か躓いた点があればQiitaに解決策を添えて投稿したいと思います。

## 最後に

最後まで読んでいただきたありがとうございました。
LIFULLでは共に成長できるような仲間を募っています。
よろしければこちらのページもご覧ください。

https://hrmos.co/pages/lifull/jobs/010

https://hrmos.co/pages/lifull/jobs/010-9998