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

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

はじめに

今回はNode.jsからSendGrid公式ライブラリを使ってメールを送信する方法をサンプルコードを交えながらご紹介します。メール文面(件名、本文)への文字列埋め込み、日本語、添付ファイルなどを利用しています。

前提条件

サンプルコードを試す前に以下の環境のセットアップを完了しておいてください。

  • Node.js 14.x
  • npm(Node.jsに同梱)
  • git
  • SendGridアカウント

本記事の内容はMacOS上に環境構築したものですが、その他のOSでも基本的に手順は同じです。Windowsの場合、cpはcopyコマンドに読み替えてください。なお、SendGrid公式ライブラリ(sendgrid-nodejs)はバージョン7.4.2を使用しています。

準備

コードサンプルをリポジトリからクローンします。

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: 送信元アドレスを指定してください。

メール送信サンプルコード

今回使用したサンプルコードを以下に示します。

// .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形式の文字列にエンコードしています。

12~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で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

送信元アドレスに「sendgrid.info経由」と表示されているのはDomain Authenticationを設定していないためです。正しく設定することで、独自ドメインからメールを送信したように表示することができます。

さいごに

SendGrid公式ライブラリを利用すると、複雑なSMTPプロトコルに触れることなく簡単にメール送信を行うことができます。文字の埋め込みやカテゴリ指定なども簡単です。
また、バウンス時の処理や配信停止の管理、送信ドメイン認証の設定などもSendGridに任せることができるので、開発工数を大幅に削減することができます。

SendGridのフリートライアル(無期限)へのお申込みはこちらから。

その他の言語については、メール送信チュートリアル【まとめ】 をご覧ください。

参考記事

その他の機能の使い方については、リポジトリに含まれるサンプルコードをご確認ください。

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。