🔛
Firebase FunctionsからGメールを送信してみる
今回やること
- 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コレクションへデータを入れます。
値には送信先メールアドレスを入力します
数秒待つと・・
来ました!これで完了です!
Discussion