メール
 Computer >> コンピューター >  >> ソフトウェア >> メール

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

Nodemailerは、サーバーから簡単にメールを送信できるNode.jsモジュールです。ユーザーとのコミュニケーションはもちろん、システム障害が発生した際の通知など、さまざまな用途で活用できます。

Nodemailerの基本的な使い方を紹介した記事は数多くありますが、本記事ではそれとは一線を画し、NodemailerとGmailを組み合わせてNode.jsバックエンドからメールを送信する、実践的で最も一般的な手法を解説します。

Nodemailer の始め方

まず、Expressを使ってNode.jsプロジェクトの雛形をセットアップしましょう。Nodeとnpmがインストールされているかどうかは、以下のコマンドで確認できます。

node -v 
npm -v

両方のコマンドでバージョン番号が表示されれば準備完了です。表示されない場合は、不足しているものをインストールしてください。

次に、プロジェクト用のディレクトリを作成します。ここでは nodemailerProject という名前を使用します。

mkdir nodemailerProject

作成したディレクトリに移動し、以下のコマンドを実行します。

npm init

これにより package.json ファイルが生成され、プロジェクトが初期化されます。

続いて、Expressをインストールします。

npm install express

エントリーポイントとして指定したファイル(デフォルトは index.js)を開き、以下のコードを貼り付けてください。

const express = require('express')
const app = express()
const port = 3000


app.listen(port, () => {
  console.log(`nodemailerProject is listening at https://localhost:${port}`)
})
index.js

上記はExpressでシンプルなサーバーを起動するために必要な最小限のコードです。以下のコマンドを実行して、正しく動作していることを確認しましょう。

node index.js

Nodemailer のインストール方法

以下のコマンドでNodemailerをインストールします。

npm install nodemailer

NodemailerのAPIは非常にシンプルで、実装は以下の3つのステップで構成されます。

  1. Transporter(トランスポーター)オブジェクトを作成する
  2. MailOptions オブジェクトを作成する
  3. Transporter.sendMail メソッドを実行する

Transporterオブジェクトは、以下のように作成します。

let transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        type: 'OAuth2',
        user: process.env.MAIL_USERNAME,
        pass: process.env.MAIL_PASSWORD,
        clientId: process.env.OAUTH_CLIENTID,
        clientSecret: process.env.OAUTH_CLIENT_SECRET,
        refreshToken: process.env.OAUTH_REFRESH_TOKEN
      }
    });
✋ 注意してください。user と pass の各キーはあなた自身のGmailアカウントの認証情報ですが、それ以外の3つのキー(clientId、clientSecret、refreshToken)は、OAuthを設定した後に取得する必要があります。

冒頭で述べたとおり、本記事ではメール送信にGmailを使用します。ご想像のとおり、Gmailはユーザーアカウントが関わるメールに対して非常に高いセキュリティレベルを備えています。

この障害を乗り越える方法はいくつかありますが、本記事では Google Cloud Platform 上でプロジェクトを作成する方法を採用します。これは、Gmailが有効化しているOAuthセキュリティの認証情報を取得するために必要な手順です。

GmailとNodemailerを併用する際の複雑さについて詳しく知りたい方は、こちらの公式ドキュメントをご参照ください。

以降のステップではコーディングではなく設定作業が中心となりますので、ご覚悟ください。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】
Photo by Daniel McCullough / Unsplash

Google Cloud Platform の設定

Google Cloud Platformのアカウントをお持ちでない場合は、事前にアカウント登録を済ませておいてください。準備ができたら、画面左上のプルダウンメニューをクリックして、新しいプロジェクトを作成します。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

「新しいプロジェクト」を選択します。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

次の画面でプロジェクト名を入力します。名前は自由に決められますが、ここでは引き続き NodemailerProject を使用します。ロケーション(組織)の項目は「組織なし」のままで問題ありません。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

プロジェクトのセットアップには数秒かかることがあります。完了すると、次のような画面が表示されます。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

左上の三本線アイコンをクリックしてナビゲーションメニューを開き、「API とサービス」を選択してください。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

NodemailerでGmailを利用できるようにするには、OAuth2を使用する必要があります。OAuthをご存じない方のために簡単に説明すると、OAuthは認証のための標準プロトコルです。ここでは詳細な仕様には踏み込みませんが、より深く理解したい場合は公式ドキュメントを参照してください。

まず、OAuth同意画面を設定します。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

G-Suiteメンバーでない場合、ユーザータイプで選択できるのは「外部」のみとなります。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

「作成」をクリックすると、次の画面でアプリケーション(今回はサーバー)の情報入力を求められます。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

「ユーザーサポートメール」と「デベロッパーの連絡先情報」の両方に、ご自身のメールアドレスを入力してください。「保存して次へ」をクリックするとスコープ設定の画面に移りますが、このステップは本記事では不要なためスキップし、テストユーザーの設定へ進みます。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

ここで自分自身をテストユーザーとして追加し、「保存して次へ」をクリックします。

OAuth 認証情報の設定方法

この段階では、Nodemailerで使用するOAuth認証情報を作成します。「OAuth同意画面」タブの上部にある「認証情報」タブへ移動してください。「認証情報を作成」と書かれたプラス(➕)ボタンをクリックし、「OAuth クライアント ID」を選択します。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

アプリケーションの種類のプルダウンメニューから「ウェブ アプリケーション」を選択します。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

「承認済みのリダイレクト URI」セクションには、OAuth2 Playground(https://developers.google.com/oauthplayground)を必ず追加してください。後ほど、このURIを使ってリフレッシュトークンを取得します。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

「作成」をクリックすると、クライアントIDとクライアントシークレットが表示されます。これらの情報は絶対に第三者に渡さず、どのような形式でも公開しないでください

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】
Photo by Power Lai / Unsplash

OAuth リフレッシュトークンの取得方法

Nodemailerのtransporterオブジェクト内で使用するリフレッシュトークンを取得するには、OAuth2 Playgroundにアクセスします。このURIは前のステップであらかじめ承認済みです。

1. 右側にある歯車アイコン(OAuth2 Configuration)をクリックし、「独自のOAuth2認証情報を使用する」チェックボックスにチェックを入れます。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

2. サイト左側にサービス一覧が表示されるので、下へスクロールして「Gmail API v1」を見つけます。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

3. 「Authorize APIs」をクリックします。

Gmailアカウントのログイン画面が表示されます。事前にテストユーザーとして登録しておいたアカウントを選択してください。

4. 次の画面では「Google hasn't verified this app(Googleでこのアプリは確認されていません)」という警告が表示されますが、まだ審査を申請していないため問題ありません。「続行」をクリックします。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

5. 続いて、プロジェクトにGmailアカウントへのアクセスを許可するかどうかを尋ねられるので、許可してください。

Nodemailer を使って Node.js サーバーからメールを送信する方法【Gmail + OAuth2 設定ガイド】

6. 許可が完了すると、OAuth Playgroundへリダイレクトされ、左側のメニューに認証コードが表示されていることが確認できます。「Exchange authorization code for tokens」という青いボタンをクリックしましょう。

これで、リフレッシュトークンとアクセストークンのフィールドが自動的に入力されます。

サーバー側の実装に戻る

すべての設定が完了したら、アプリケーションに戻り、取得した認証情報をtransporterの作成コードに組み込みましょう。認証情報を安全に管理するために、dotenvパッケージの利用をおすすめします。また、作成した .env ファイルを .gitignore に追加して、誤って公開リポジトリにアップロードしないよう注意してください。

これで、コードは以下のようになります。

let transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        type: 'OAuth2',
        user: process.env.MAIL_USERNAME,
        pass: process.env.MAIL_PASSWORD,
        clientId: process.env.OAUTH_CLIENTID,
        clientSecret: process.env.OAUTH_CLIENT_SECRET,
        refreshToken: process.env.OAUTH_REFRESH_TOKEN
      }
    });

次に、送信先アドレスやメール本文などの詳細情報を保持する mailOptions オブジェクトを作成します。

let mailOptions = {
      from: tomerpacific@gmail.com,
      to: tomerpacific@gmail.com,
      subject: 'Nodemailer Project',
      text: 'Hi from your nodemailer project'
    };

このオブジェクトにはさらに多くのフィールドを指定でき、複数の受信者への同時送信も可能ですが、ここでは割愛します。

最後に、sendMailメソッドを呼び出します。

transporter.sendMail(mailOptions, function(err, data) {
      if (err) {
        console.log("Error " + err);
      } else {
        console.log("Email sent successfully");
      }
    });

アプリケーションを実行すると、受信トレイに新しいメールが届いていることを確認できます。

本記事は、筆者がNodemailerを使用して実際に開発したプロジェクトに着想を得たものです。興味のある方は、ぜひ元プロジェクトもチェックしてみてください。

  1. Macの標準メールアプリで暗号化メールを送信する方法【S/MIME証明書の取得から設定まで】

    通常、メールのやり取りはプロバイダーがセキュリティを管理しているため、比較的安全なものとされています。しかし、メールの暗号化は利用しているメールサービスによっては対応していない場合もあります。より強固にメールを守りたいなら、自分のメールアプリで暗号化機能を使うのがおすすめです。 Macユーザーであれば、標準搭載されている「メール」アプリだけで暗号化メールを送信できます。この記事では、その設定方法と使い方を詳しく解説します。 macOSに内蔵されたメールアプリは、送信前にメール内容を暗号化することが可能です。ただし、この暗号化を行うには、事前にMacへメール用のデジタル証明書をインストールして

  2. パソコンからテキストメッセージ(SMS)を送信する方法|Android Messagesの「ウェブ版メッセージ」活用ガイド

    GoogleとAppleのライバル関係は、今さら言うまでもないことでしょう。両社は新製品や新サービスの発表のたびに競い合ってきました。そんな中、Googleはメッセージングアプリ「Android Messages」に「ウェブ版メッセージ(Messages for web)」という新機能を追加し、アプリを大きく強化しました。この機能を使えば、パソコンのブラウザから直接テキストメッセージ(SMS)を送受信できます。Appleがいち早く提供していたiMessageと同等の機能として、Androidユーザーが最も待ち望んでいたもののひとつです。 ※なお、Android Messagesは現在「Goog