Firebase Cloud Functions でのメールフォーム用 function を作る
いわゆるメールフォーム機能がほしい。基本無料で使えて、SPAMは弾いて、自分にメールが届けばok、という単純な要件なので、Cloud Fuctions for Firebase で作った。TypeScriptでの実装例はこんな感じ。
Cloud Functions で各種値を取得するために、functions:config:set
で値を入れ、適当に onCallかHTTP経由での関数呼び出しにマッピングすれば OK。
npx firebase functions:config:set \
gmail.user="" \
gmail.client-id="" \
gmail.client-secret="" \
gmail.refresh-token="" \
recaptcha.v3secret=""
smpt は Colud Functions で叩ける API 群にはないので、Gmail からメールを送れる OAuth2 の cliendId / clientSecret / refreshToken を取得する。これがややこしくて面倒なのだけど、node.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送る の方法で取得すれば OK。なおnode.js 上の nodemailer で OAuth 2.0 を使って gmail からメールを送るにのっているserver.js
のサンプルコードは私の環境ではうまく動かず、nodemailer のドキュメント通りにやったらうまく動いた。
メール送信APIだけだとspamロボットが叩きまくるので、reCAPTCHA v3を使って、人かどうかの判定も入れている。なおクライアントサイド(Webブラウザ)側ではreact-google-recaptcha-v3を使ってる。
以前、このサイトにおたよりフォームを作った時には、いわゆるメールフォーム機能を提供しているサービスを比較検証して作ったのだけど、それよりもとっとと自分で Cloud Functions で作ったほうが簡単かつ短時間で終わったのだった。
Firebase Extensionsが一般の開発者も公開できるようになり、かつ Cloud Fucntions とうまくマッピングできれば、各種設定だけ入力して自分のプロダクトにデプロイできるようになり、たとえば今回のようなメールフォームのユースケースを満たす単機能 function は自ら実装することなく利用できるようになるだろうから、今後拡充していくと嬉しいなぁ。
(なお今でも extensions として、firestore-send-emailがあるけど、これは firestore のドキュメントをトリガーに smtp でメールを送るものなので、用途が異なる。)