Node.jsでメール送信!
Twilio SendGridを使って簡単に実装する方法

はじめに
今回はNode.jsからTwilio SendGrid公式ライブラリを使ってメールを送信する方法をサンプルコードを交えながらご紹介します。メール文面(件名、本文)への文字列埋め込み、日本語、添付ファイルなどを利用しています。
前提条件
サンプルコードを試す前に以下の環境のセットアップを完了しておいてください。
- Node.js 20.x
- npm(Node.jsに同梱)
- git
- SendGridアカウント(送信元ドメインでDomain Authenticationを設定したアカウント)
本記事の内容はLinux(Debian)上に環境構築したものですが、その他のOSでも基本的に手順は同じです。Windowsの場合、cpはcopyコマンドに読み替えてください。なお、SendGrid公式ライブラリ(sendgrid-nodejs)はバージョン8.1.3を使用しています。
準備
コードサンプルをリポジトリからクローンします。
git clone git@github.com:SendGridJP/sendgridjp-nodejs-example.git
リポジトリ内に移動して.env.exampleをコピーします。
cd sendgridjp-nodejs-example cp .env.example .env
.envファイルを編集(後述)します。
npmによる依存関係の解決を行います。
npm install
サンプルを実行します。
node sendgrid-nodejs-example.js
.envファイルの編集
.envファイルは以下のような内容になっています。
API_KEY=api_key TOS=you@youremail.com,friend1@friendemail.com,friend2@friendemail.com FROM=you@youremail.com
API_KEY:SendGridのAPI Key(Mail SendへのFull Accessパーミッションが必要)を指定してください。
TOS:宛先をカンマ区切りで指定してください。サンプルコードの関係上、宛先は3つ以上指定してください。
FROM:送信元アドレス(Domain Authenticationを設定したドメインのメールアドレス)を指定してください。
メール送信サンプルコード
今回使用したサンプルコードを以下に示します。
// .envから環境変数の読み込み
require('dotenv').config();
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.API_KEY);
const from = process.env.FROM;
const tos = process.env.TOS.split(',');
// 添付ファイルデータのBASE64エンコード
const fs = require('fs');
const attachment = fs.readFileSync('./gif.gif').toString('base64');
// メッセージの構築
const msg = {
personalizations: [
{
to: tos[0],
substitutions: {
fullname: '田中 太郎',
familyname: '田中',
place: '中野'
}
},
{
to: tos[1],
substitutions: {
fullname: '佐藤 次郎',
familyname: '佐藤',
place: '目黒'
}
},
{
to: tos[2],
substitutions: {
fullname: '鈴木 三郎',
familyname: '鈴木',
place: '中野'
}
}
],
from: {
email: from, // 送信元アドレス
name: '送信者名' // 送信者名
},
subject: '[sendgrid-nodejs-example] フクロウの名前は%fullname%さん', // 件名
text: '%familyname%さんは何をしていますか?\n彼は%place%にいます', // textパート
html: '<strong>%familyname%さんは何をしていますか?</strong><br>彼は%place%にいます。', // htmlパート
substitutionWrappers: ['%', '%'], // 置換タグの指定
// カテゴリ
cagtegories: 'category1',
// カスタムヘッダ
headers: {
'X-Sent-Using': 'SendGrid-API'
},
// 添付ファイル
attachments: [
{
content: attachment, // 添付ファイルのBASE64エンコードデータ
filename: 'owl.gif' // 添付ファイル名
}
]
};
(async () => {
try {
// 送信
const response = await sgMail.send(msg);
// 結果出力
const obj = JSON.parse(JSON.stringify(response[0]));
console.log(obj.statusCode);
console.log(obj.body);
console.log(obj.headers);
} catch (error) {
console.error(error);
}
})();
解説
1~6行目
環境変数からSendGridの認証情報、送信元アドレス、宛先リストを読み込んでいます。
8〜10行目
添付ファイルを読み込み、そのデータをBASE64形式の文字列にエンコードしています。
14~44行目
宛先リスト、送信元アドレス、送信者名、Substitution(宛先ごとの文字列置換)を設定しています。宛先を複数指定しても配信されたメールの宛先には他の宛先が見えることはありません。受信者のアドレスのみ設定されます。
また、複数の宛先を指定した場合でも送信リクエストは1回となるため、大量の宛先に対して高速に送信処理要求を送ることが可能です。宛先リストは最大で1,000アドレスまで指定可能です。
46~49行目
メールの件名と本文(text/plainおよびtext/html)を設定しています。「%fullname%」「%familyname%」「%place%」はSubstitutionタグです。49行目のsubstitutionWrappersにより、「%」で括られた文字列がSubstitutionタグとみなされます。18行目でfullnameとして「田中 太郎」を指定しているので、本文中の「%fullname%」は「田中 太郎」に置き換えられます。substitutionWrappersでタグを指定しない場合、タグの始まりと終わりの記号には「{{」と「}}」が自動的に指定されます。その場合、「{{fullname}}」が「田中 太郎」に置換されることとなります。
51~64行目
カテゴリ、任意ヘッダ、添付ファイルを設定しています。カテゴリを指定しておくと、カテゴリごとにメール配信に関わる統計情報を取得することができるようになります。
67~79行目
メールを送信してレスポンスを出力しています。
実行結果
各宛先には次のようなメールが配信されます。
宛先には、自分のみが設定されていることがわかります。
Substitutionタグで指定した文字列に置換されていることが確認できます。
宛先1で受信したメール

宛先2で受信したメール

さいごに
SendGrid公式ライブラリを利用すると、簡単にメール送信を行うことができます。文字の埋め込みやカテゴリ指定なども簡単です。
また、バウンス時の処理や配信停止の管理、送信ドメイン認証の設定などもSendGridに任せることができるので、開発工数を大幅に削減することができます。
SendGridのフリートライアル(無期限)へのお申し込みはこちらから。
その他の言語については、メール送信チュートリアル【まとめ】 をご覧ください。
参考記事
その他の機能の使い方については、リポジトリに含まれるサンプルコードをご確認ください。


