6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-06-08

概要

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

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

メール送信の実行ファイル

'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;

    // 宛先1
    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'] = [
            // 宛先1用の宛先とメール本文を設定
            {
                to: to1,
                substitutions: {
                    htmlMessage: html1,
                    textMessage: text1
                }
            },
            // 宛先2用の宛先とメール本文を設定
            {
                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;
    }
}

解説

環境変数の設定

// AWS Lamdaの環境変数に登録したSendGridのAPIキーを取得
sgMail.setApiKey(process.env.SENDGRID_API_KEY);

Lamdaの設定タブから環境変数が設定できるため、そこから取得します。

宛先毎のカスタマイズ

        messageFields['personalizations'] = [
            // 宛先1用の宛先とメール本文を設定
            {
                to: to1,
                substitutions: {
                    htmlMessage: html1,
                    textMessage: text1
                }
            },
            // 宛先2用の宛先とメール本文を設定
            {
                to: to2,
                substitutions: {
                    htmlMessage: html2,
                    textMessage: text2
                }
            }
        ];

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

メール本文のカスタマイズ

messageFields['html'] = '%htmlMessage%'; // htmlメール文
messageFields['text'] = '%textMessage%'; // textメール文
messageFields['substitutionWrappers'] = ['%', '%'];// 置換タグの指定

personalizationsのsubstitutionsで宛先毎に本文を設定しておき、設定した本文をmessageFieldsに設定します。%で囲ったキーワードにsubstitutionsを埋める仕組みとなっています。例えば、htmlMessageに「い」と設定し、「あ%htmlMessage%う」となっていたならば、「あいう」となります。宛先毎のメール本文が大きく異なる場合は最初と最後に%で囲む方法が良いかと思います。

余談

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

参考サイト

6
1
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
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?