Loading
BLOG 開発者ブログ

2023年8月7日

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

この記事では次の2点を目的に執筆しています。

  • FirestoreのドキュメントをonCreateトリガーにして、Functions(Node.js)を走らせる
  • Functionsでドキュメントに含まれるメールアドレス宛にGメールを送信する

目次

はじめに

こんにちは、クラウドソリューショングループのmiyajima.yです。
先日会社の仲間達とハッカソンに参加してきました。初体験でしたのでたくさんの学びがあり、大っっっ変よかったです。
バックエンドを担当したのですが、Firebaseはほぼ初見だったため結構時間を食ってしまったことと、
Googleのセキュリティ仕様を知らずに「Firebaseがお釈迦になった!!」と、MajiでKireる5秒前だったので
この記事ではFirestore, Functionsの基本機能を使うこと、サードパーティ製アプリからGメールを送る時の注意点を中心に書いていきます。

事前準備

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

やってみよう

Function作成

ローカルのFunctions管理ディレクトリにデフォルトでfunctions/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の対象ドキュメントをonCreateトリガーとする。今回はresultドキュメント配下のすべてを対象とする。
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アカウントを認証する必要があるので、アプリパスワードを生成します。

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

と思われた方、はい、僕です。(Outlookはできたから余計時間が…)

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

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

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

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

環境変数設定

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

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

デプロイ

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

動作確認

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


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

数秒待つと・・

来ました!成功です!

最後に

Firebase初めて使うよー。Firestoreからデータどうやってとるのー。Gメール送信できないよー。という方へ少しでもお力になれたら嬉しく思います。
ハッカソンや今回の執筆にあたり実際にFirebaseを触ってみて、改めてこんなサービスを無料で使えるのってすごいなぁ・・と、もっと勉強しないと・・の焦りが生まれました。

ananのブログ