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}`)
})上記はExpressでシンプルなサーバーを起動するために必要な最小限のコードです。以下のコマンドを実行して、正しく動作していることを確認しましょう。
node index.jsNodemailer のインストール方法
以下のコマンドでNodemailerをインストールします。
npm install nodemailerNodemailerのAPIは非常にシンプルで、実装は以下の3つのステップで構成されます。
- Transporter(トランスポーター)オブジェクトを作成する
- MailOptions オブジェクトを作成する
- 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を併用する際の複雑さについて詳しく知りたい方は、こちらの公式ドキュメントをご参照ください。
以降のステップではコーディングではなく設定作業が中心となりますので、ご覚悟ください。

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

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

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

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

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

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

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

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

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

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

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

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

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

OAuth リフレッシュトークンの取得方法
Nodemailerのtransporterオブジェクト内で使用するリフレッシュトークンを取得するには、OAuth2 Playgroundにアクセスします。このURIは前のステップであらかじめ承認済みです。
1. 右側にある歯車アイコン(OAuth2 Configuration)をクリックし、「独自のOAuth2認証情報を使用する」チェックボックスにチェックを入れます。

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

3. 「Authorize APIs」をクリックします。
Gmailアカウントのログイン画面が表示されます。事前にテストユーザーとして登録しておいたアカウントを選択してください。
4. 次の画面では「Google hasn't verified this app(Googleでこのアプリは確認されていません)」という警告が表示されますが、まだ審査を申請していないため問題ありません。「続行」をクリックします。

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

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を使用して実際に開発したプロジェクトに着想を得たものです。興味のある方は、ぜひ元プロジェクトもチェックしてみてください。
-
Macの標準メールアプリで暗号化メールを送信する方法【S/MIME証明書の取得から設定まで】
通常、メールのやり取りはプロバイダーがセキュリティを管理しているため、比較的安全なものとされています。しかし、メールの暗号化は利用しているメールサービスによっては対応していない場合もあります。より強固にメールを守りたいなら、自分のメールアプリで暗号化機能を使うのがおすすめです。 Macユーザーであれば、標準搭載されている「メール」アプリだけで暗号化メールを送信できます。この記事では、その設定方法と使い方を詳しく解説します。 macOSに内蔵されたメールアプリは、送信前にメール内容を暗号化することが可能です。ただし、この暗号化を行うには、事前にMacへメール用のデジタル証明書をインストールして
-
パソコンからテキストメッセージ(SMS)を送信する方法|Android Messagesの「ウェブ版メッセージ」活用ガイド
GoogleとAppleのライバル関係は、今さら言うまでもないことでしょう。両社は新製品や新サービスの発表のたびに競い合ってきました。そんな中、Googleはメッセージングアプリ「Android Messages」に「ウェブ版メッセージ(Messages for web)」という新機能を追加し、アプリを大きく強化しました。この機能を使えば、パソコンのブラウザから直接テキストメッセージ(SMS)を送受信できます。Appleがいち早く提供していたiMessageと同等の機能として、Androidユーザーが最も待ち望んでいたもののひとつです。 ※なお、Android Messagesは現在「Goog