SendGridを用いて複数宛先に宛先毎の本文をカスタマイズしメールを送信する方法

# 概要
SendGridで複数の宛先かつ宛先毎に本文の内容をカスタマイズし、自動でメールを送信する方法を紹介します。
[kintone WebhookとAWS Lamdaの連携方法をより詳しく説明する！](https://qiita.com/nacho0707/items/25dc60e6f186c02ff5cf)で紹介したKintoneの保存イベント時にAWS LamdaからSendGridのAPIを呼び出すことを想定しておりますが、このケース以外でも共通の部分はあるかと思います。

基本的にはSendGrid公式ライブラリ(Node.js)を使用して作成しました。
https://github.com/sendgrid/sendgrid-nodejs#usage

# メール送信の実行ファイル
```javascript
'use strict';
const sgMail = require('@sendgrid/mail');

/**
 * 対象のユーザにメールの送信
 */
async function sendMail(event) {
    // AWS Lamdaの環境変数に登録したSendGridのAPIキーを取得
    sgMail.setApiKey(process.env.SENDGRID_API_KEY);

    // kintoneから送信された値の取得
    event.body = JSON.parse(event.body);
    const record = event.body.record;

    // 宛先１
    const to1 = record.to1.value;
    // 宛先2
    const to2 = record.to2.value;

    // メール本文
    // to1に送るメール(htmlメール用)
    const html1 =
        '<p>こんにちは</p>' +
        '<p>いつもありがとうございます！</p>';

    // to1に送るメール(textメール用)
    const text1  =
        'こんにちは\n' +
        'いつもありがとうございます！';

    // to2に送るメール(htmlメール用)
    const html2  =
        '<p>はじめまして</p>' +
        '<p>よろしくお願いします！</p>';

    // to2に送るメール(textメール用)
    const text2 =
        'はじめまして\n' +
        'よろしくお願いします！';

    let messageFields = {
        // 件名
        subject: 'サンプル',
        // 送信元のメールアドレス
        from: process.env.FROM_MAIL_ADDRESS
    };

        messageFields['personalizations'] = [
            // 宛先１用の宛先とメール本文を設定
            {
                to: to1,
                substitutions: {
                    htmlMessage: html1,
                    textMessage: text1
                }
            },
            // 宛先２用の宛先とメール本文を設定
            {
                to: to2,
                substitutions: {
                    htmlMessage: html2,
                    textMessage: text2
                }
            }
        ];
        messageFields['html'] = '%htmlMessage%'; // htmlメール文
        messageFields['text'] = '%textMessage%'; // textメール文
        messageFields['substitutionWrappers'] = ['%', '%'];// 置換タグの指定

    await sgMail
        .send(messageFields)
        .then(() => {
            console.log('OK');
        })
        .catch((error) => {
            console.log('NG');
            throw error;
        });
}

/**
 * メイン処理
 */
async function main(event, context) {
    try {
        // 送信
        await sendMail(event);
    } catch (error) {
        console.log('main:NG');
        throw error;
    }
}

```

# 解説
### 環境変数の設定
```javascript
// AWS Lamdaの環境変数に登録したSendGridのAPIキーを取得
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
```
Lamdaの設定タブから環境変数が設定できるため、そこから取得します。

### 宛先毎のカスタマイズ
```javascript
        messageFields['personalizations'] = [
            // 宛先１用の宛先とメール本文を設定
            {
                to: to1,
                substitutions: {
                    htmlMessage: html1,
                    textMessage: text1
                }
            },
            // 宛先２用の宛先とメール本文を設定
            {
                to: to2,
                substitutions: {
                    htmlMessage: html2,
                    textMessage: text2
                }
            }
        ];
```

personalizationsを使用して宛先毎のメールアドレスと本文を設定します。

### メール本文のカスタマイズ
```javascript
messageFields['html'] = '%htmlMessage%'; // htmlメール文
messageFields['text'] = '%textMessage%'; // textメール文
messageFields['substitutionWrappers'] = ['%', '%'];// 置換タグの指定
```
personalizationsのsubstitutionsで宛先毎に本文を設定しておき、設定した本文をmessageFieldsに設定します。%で囲ったキーワードにsubstitutionsを埋める仕組みとなっています。例えば、htmlMessageに「い」と設定し、「あ%htmlMessage%う」となっていたならば、「あいう」となります。宛先毎のメール本文が大きく異なる場合は最初と最後に%で囲む方法が良いかと思います。

# 余談
AWS Lamdaで実装を進める際はconsole.log()でログを吐き出しながら進めました。普段ディベロッパーツールを使用してデバックをしているためなかなか苦労しました。。console.log()はこまめに設置して進めるのがよいかと思います！


# 参考サイト
https://sendgrid.kke.co.jp/blog/?p=12633

https://sendgrid.kke.co.jp/blog/?p=1026