Document Title:
Gmail API with Service Account and ...
Document Path:
/004-gmail-api-with-service-account...

Gmail API with Service Account and Nodemailer

2024/8/29
The Muse: History
The Muse: History
Camille Corot
ca. 1865

Nodemailerを使って特定のGmailアカウントを経由してメールを送信する方法を以下にまとめておく。

Gmail APIの認証情報の取得

  1. Google Cloud Platform (GCP) プロジェクトの作成:
  2. Gmail APIの有効化:
  3. サービス アカウントの作成:
    • GCPの「認証情報」ページで「認証情報を作成」をクリックし、「サービスアカウント」を選択
    • 特にその他の設定は不要
  4. キーの作成:
    • 「キー」タブを選択し、「+ 新しいキーを追加」をクリックして、新しいJSONキーを作成
    • 作成したキーを保存
  5. OAuth 同意画面の設定:
    • 「OAuth 同意画面」を設定し、必要な情報を入力
    • スコープにはhttps://www.googleapis.com/auth/gmail.sendを追加

ドメイン全体の委任の有効化

Google Workspaceで管理しているドメインの場合は、ドメイン全体の委任を有効化する必要がある。

  • Google Workspace Admin Consoleにアクセス
  • 「Security」 > 「Access and data control」 > 「API controls」を選択
  • 「Domain-wide delegation」セクションで「Manage domain-wide delegation」をクリックし、「+ Add new」を選択
  • クライアントIDとして先ほど作成したサービスアカウントのクライアントIDを入力(JSONキーの中にあるclient_idの値)
  • OAuthスコープとしてhttps://www.googleapis.com/auth/gmail.sendを追加して「Authorize」をクリック

Nodemailer

  1. NodemailerとGoogle APIsパッケージのインストール:
bash
npm install nodemailer googleapis
  1. 環境変数の設定:

ダウンロードしたJSONのキーファイルの中身は以下のようになっている。 このファイルの中から、以下の値を環境変数に設定する。

xxxxxxxxx-xxxxxxxxx.json
{ "type": "service_account", "project_id": "xxxxxxxxx", "private_key_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "private_key": "-----BEGIN PRIVATE KEY-----\n...", "client_email": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.iam.gserviceaccount.com", "client_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.iam.gserviceaccount.com", "universe_domain": "googleapis.com" }
.env
GOOGLE_CLIENT_EMAIL= GOOGLE_PRIVATE_KEY= GOOGLE_PROJECT_ID= GOOGLE_FROM_EMAIL=

メール送信のコード例

typescript
import nodemailer from "nodemailer"; const transporter = nodemailer.createTransport({ service: "gmail", auth: { type: "OAuth2", user: process.env.GOOGLE_FROM_EMAIL!, serviceClient: process.env.GOOGLE_CLIENT_EMAIL!, privateKey: process.env.GOOGLE_PRIVATE_KEY?.replace(/\\n/g, "\n"), // 改行コードを変換 }, }); const result = await transporter.sendMail({ from: { name: "タコ", address: process.env.GOOGLE_FROM_EMAIL!, }, to, subject, text, html, });

private_keyには改行コードが含まれている。

環境変数に設定したときに改行コードが文字列として認識されてしまうため、改行コードを変換する必要がある。

typescript
const privateKey = process.env.GOOGLE_PRIVATE_KEY?.replace(/\\n/g, "\n");

以上。