🔛

Firebase FunctionsからGメールを送信してみる

2023/07/22に公開

今回やること

  • FirestoreのドキュメントをonCreateトリガーにして、Functions(Node.js)を走らせる
  • Functionsでドキュメントに含まれるメールアドレス宛にGメールを送信する
    • (小話)先日参加したハッカソンで、アプリ開発中に詰まったポイントだったので備忘録も兼ねて。

事前準備

  • Firebase(Functions, Firestore)の初期設定
  • GoogleアカウントのMFA有効化

やってみよう

Function作成

デフォルトでfunctions/index.jsが作成されるので、そちらにソースコードを記述します。

index.js
const functions = require('firebase-functions'); //ver: "firebase-functions": "^4.3.1"
const admin = require('firebase-admin'); //ver: "firebase-admin": "^11.8.0"
const nodemailer = require('nodemailer'); //ver: "nodemailer": "^6.9.3"

admin.initializeApp();

// Firestoreのresultドキュメント配下のすべてを対象にonCreateトリガーでFunctionsを動かす
exports.sendEmail = functions.firestore.document('/result/{documentId}')
  .onCreate(async (snap, context) => {

  // トリガー対象のドキュメントからデータを取得する
  const resultData = snap.data();
  const to = resultData.email;

  // メール内容
  const subject = 'メールのタイトルです。';
  const message = 'メールの内容です。';
  const from = process.env.MAIL;
  const pass = process.env.PASS;

  try {
    // SMTPトランスポータの作成
    const transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: from,
        pass: pass
      }
    });

    // メールオプションの設定
    const mailOptions = {
      from: from,
      to: to,
      subject: subject,
      text: message
    };

    // メール送信
    const info = await transporter.sendMail(mailOptions);
    console.log('メールが送信されました:', info.response);
  } catch (error) {
    console.error('メールの送信中にエラーが発生しました:', error);
  };
});

Googleアプリパスワード生成

メール送信時に、送信元のGoogleアカウントを認証する必要があるので、アプリパスワードを生成します。

「普通のメールアドレスとPWじゃだめなの?」

と思われた方、はい、僕です。(Outlookはできたから余計時間かかったんだよなぁ...)

サードパーティ製のアプリからGメールを送信する場合、Googleのセキュリティ仕様により通常のPWでは認証できません。詳しくはこちら
そのためのアプリパスワードというわけです。

Googleアカウント管理画面より、セキュリティ > 2段階認証プロセス > アプリ パスワード から以下を設定します。

  • アプリを選択: メール
  • デバイスを選択: その他 (名前を入力) → 何でも良いですが、今回はFirebase Functionsにしておきましょう。

するとこんな感じでアプリパスワードを生成できるのでコピーします。

環境変数設定

functions配下に.envを生成してください。
(Git管理する場合は.gitignoreに追加するのをお忘れずに!)

.env
MAIL="メールアドレス"
PASS="先ほどのアプリパスワード"

デプロイ

CLIでfirebase deploy --only functions (またはfirebase deploy) コマンドを入力してデプロイし、Deploy complete! とレスポンスがあったらあとは動かすだけです!

動作確認

Firestoreのコンソールを開き、以下のキャプチャを参考にresultコレクションへデータを入れます。



値には送信先メールアドレスを入力します

数秒待つと・・

来ました!これで完了です!

GitHubで編集を提案

Discussion