#あすみかんの上にあすみかん

#たのしいことしかかかないことをここに決意します

SendGridのDynamic Templatesであげみざわ〜〜〜〜〜〜〜〜〜〜〜〜

Hameeのカレンダー | Advent Calendar 2020 - Qiita

こんばんは〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
5日が始まった瞬間に5日の分のアドベントカレンダーを書いてごめんなちゃ〜〜〜〜〜〜〜い
自分のブログが面白くて読んでたらこんな時間になっておりました。
嘘ですapexしてました。いやブログも読んでました。
そんなこんなでHameeアドベントカレンダー参加(3年目)です🌸
(どんなこんな?)

1年目
asumikan.hatenablog.com


2年目
asumikan.hatenablog.com


アドベントカレンダー関係なく面白いブログ
asumikan.hatenablog.com
asumikan.hatenablog.com



今日はですね、SendGridの Dynamic Templatesのお話をしたいと思います!!

Dynamic Templatesとは

SendGrid側に変数を代入できるテンプレートメールが用意してあって
それを用いてメールを送れるみたいなやつですね
詳しくは下記をみてください

sendgrid.kke.co.jp

(雑な説明)

何故 Dynamic Templatesを選ぶのか?

通常は、
トランザクションメールならAPI経由の送信だし、
マーケティングメールだったらUI経由でのメール送信
になるかと思います。

言うなれば、 Dynamic Templatesを使用したメール送信は上記の2方法のサラブレッドなトランザクションメール送信方法だと思っています。..............サラブレッドって馬か?ハイブリッドか。いや、これは車か...?...............あれですね、
合わさっていいとこ取りなわけですね!

いいとこ取りというのは、つまり、以下のような作業分割ができます。

作業者 やること
マーケター側 SendGridの画面から可愛いHTMLメールを作成する
開発側 APIから先ほどのDynamic Templatesを指定してメールを送信する

下記で実際に可愛いメールをAPI経由で送信してみようと思います。





一人二役で運用の流れを説明する

👩‍💼 マーケター側のワタシ

はい。マーケター側のワタシです。ていうかメールを用意する人たちが一般的な会社でマーケターというかどうかはちょっとわからないですが、あすみ株式会社ではマーケターがメールを送信しております。

Emil API > Dynamic Templates

これがDynamic Templatesの画面ね。新しく作るときは右上のボタンを押すわ
🐕🐩🦮🐕‍🦺 ポチッ 🐕🐩🦮🐕‍🦺


Create a Dynamic Template

好きなタイトルを入力するわ。今回はテキトーにhello_emailにするわね。


Dynamic Templateができた

そうするとDynamic Templateができたわね。
このd-XXXXXXXXXの部分が後で肝になってくるって開発側が言っていたかしら。


Dynamic Template編集画面

あとはこのワタシがカンワイイメールを作ればいいだけね。
カンワイイメールを作るときには開発側から教えてもらった"変数"を使って記入するわ。
この変数については適宜アプリケーション側で取得できる値を開発側に教えてもらってそれをDynamic Tempalteの記法に合わせて良い位置に代入するってワケ。もしこちら側で変数名ミスってたり定義されていない変数を使っていたりすると、そこの部分は空白で表示されるので、タイポなどはしないように気を付ける必要があるわね。(説明すぎるセリフを言うキャラ)
そうそう、Add Modulesから色んなものが埋め込めるから便利なのよね。
自分でメールの文章も考えられるし、可愛くもできるしサイコーってワケ



そしてできあがったカンワイイメールがこちら



カンワイイのは猫だけ...

Dynamic Template内はif文かけたりするらしいわよ。
この記事では詳しく喋らないので気になったらいろいろ調べて見るといいわ。
でも開発側は「if文死ぬほどあるメールめちゃめちゃキツイからゴリゴリのif文はよした方が良いぜ」って言ってた気がするわ。

これでワタシの仕事はオワリ。 

👨‍💻 開発側のワタシ

はい、前述の通り、マーケターの方がメールを作ってくれました。

メール送信してくれるありがたFunction

SendGridのWeb API v3を用いてPHPで実装します。
Web API v3の仕様と使い方 - ドキュメント | SendGrid

PHP側に以下のようなSendGridのライブラリのラッパーコードを作っておきます。
(composerを使ってインスココ)

<?php
class Mail {
    public static function send(string $to, string $sendgrid_template_title, array $dynamic_template_data, string $from = null)
    {
        if (is_null($from)) $from = 'hogehoge@default.com';

        $request_body = [
            'personalizations' => [
                [
                    'to' => [
                        [
                            'email' => $to,
                        ]
                    ],
                    'dynamic_template_data' => $dynamic_template_data,
                ],
            ],
            'from' => [
                'email' => $from,
            ],
            'template_id' => "{{d-から始まるtemplate id}}",
        ];

        // SendGrid自体が死んでる場合はレスポンスすら取得できない可能性があるのでtry-catch
        try {
            $sg =  new \SendGrid("自分のAPIキー");
            $response = $sg->client->mail()->send()->post($request_body);
        } catch (\Exception $e) {
            throw new \Exception('Failed to send email');
        }
    }
}

$request_bodyに上記のようなjsonの元になる配列を作ります。
dynamic_template_dataには、そのメールの変数に代入したい変数たちがくる予定です。(後述)

実際にメールを送信する時

先ほどマーケターの方がカンワイイなメールを作ってくれたので、採用した変数をこちら側で代入してAPI経由でメールを送信します。
以下の様にパラメータを適宜注入して送信するだけですね。かんたーん。

<?php
class hogeController {
    public function indexAction()
    {
        $to = "test@test.comcomcom";
        $dynamic_template_data = [
            'name'  => 'asumikan',
            'genki' => true,
        ];
        Mail::send($to, $dynamic_template_data);
    }
}


で、メールを送信!すると....

カンワイイメールがキタ!

genkiはtrueなので、asumikanさん宛に、agemizawa!の方が来てますね。
普段APIを使ってメール送信するときと差異ない感じでメールが送信できます。

つらいところ

まぁ上記の感じでいい感じに作業分担もできるしクオリティ高いメールを作ってもらうこともできるし最高最高!ってかんじなのですが、辛いところもあります。

  • template id をコピペするのがツライ。
赤線の部分

ここに表示されているtemplate idをコピペしてDBやなんやらに保存(環境毎に違うのであれば、開発環境、ステージング環境、本番環境、全ての環境をコピペ)する必要があります。
で、もしサービスの立ち上がりだったとすると、仮登録・新規登録・問合せメール・購入メール・なんとかめーる・それとかめーる・....全ての環境を間違えずにコピペする必要があります。
やばwwwwwwむずすぎめんどすぎワロタwwwwwです。
これ、本当にこの運用採択してよかったのか?と鬱になるレベルです。うまく入ったと思ったら、スペースが入ってたりしたらやばくないですか?やばいんですよ。
もしかしたら私が原始人すぎるだけかも(他に方法あるかも)しれないので、ある場合はこっそり教えてください。

同じ問題でtemplate側で指定している変数とこちら側で採用している変数を合わせる必要もありますね(前のどっかで言った)

  • SDK側でエラーハンドリングできない

これ、たとえばtemplate idとかが間違ってたりしてもスクリプト側では正常終了の様になってしまうんですね・・・。
で、管理者には以下の様なメールはくるんですが、スクリプト側でエラーになってほしす・・・。

送れなかったよっていうSendGridさんからのメール
  • 作ったテンプレートをコピーできない

手でコピペするしか無いのがキツイ。

良さそうで使ってみたいところ

Dynamic Templateのversion管理できそうなので、新しいメールに張り替えるよー!!って時は旧バージョンはそのまま送信しておいて、新しいバージョンで作り終えた後、ヨッシャ切替ー!!みたいなことができそうではあります!

UI上で切り替えもできる

多分まだまだ発展途上

今の感じだと、手作業わりと多し多しなので、ナチュラルにAPI経由でぶっ叩いた方がいいのかもしれませんが、今後いろいろ使いやすくなってくのかな〜〜と思っております。
また、何度も言ってますが、分割することによって、作業者がやりたいことができる(エンジニアが可愛いメールのHTML作らなくて良くなる・マーケターが好きな時にメールのデザインを変更できる)とかはめちゃめちゃ魅力的なのかな〜〜と思っているので、私はDynamic Templates推しでいきたいとおもっています!!!!

長くなりましたが、これにてドロンしましょうかと思います!!
寝るまでが5日!!!!バァイ(ブンブン)(始まってるやないかい!)