概要
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()はこまめに設置して進めるのがよいかと思います!
参考サイト