昨天把搜尋做完,今天上線「Email 提醒」:每天晚間固定時間檢查誰今天還沒寫日記,才寄一封提醒信;如果今天已經寫過,就不會打擾你。為了保持「免費」,我用了 SendGrid 免費方案 + GitHub Actions 定時呼叫,避開了 Firebase Cloud Scheduler / Blaze Plan 的付費排程
SENDGRID_API_KEY=xxxx
FROM_EMAIL=你的寄件地址
在程式裡用:from: { email: process.env.FROM_EMAIL, name: 'Mood Journal' }
這樣 Gmail 就會顯示寄件人是 Mood Journal
Error: 7 PERMISSION_DENIED: Missing or insufficient permissions.
在 GitHub Actions 裡設環境變數:
FIREBASE_PROJECT_ID=xxxx
CLIENT_EMAIL=firebase-adminsdk-xxx@xxx.iam.gserviceaccount.com
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nxxxx\n-----END PRIVATE KEY-----\n"
注意 \n 要保留換行。另外,要確認 Firestore Security Rules 有允許 service account 存取,不然還是會被擋
明天要處理 隱私與安全:強化 Firestore 規則,並嘗試在本地端加密日記內容,確保就算資料外流,別人也看不懂
A. Firebase 原生流派(最直覺、最穩)
什麼:Cloud Scheduler ➜ 觸發 HTTPS Cloud Function ➜ 檢查 Firestore ➜ 寄信(SendGrid/Gmail)
優點:整套都在 GCP/Firebase,部署一次就穩
缺點:Cloud Scheduler/Functions 屬於計費服務(有免費額度,但不是純 0 元);要綁計費帳。
適合:不介意綁卡、要少踩坑的人
B. Cloudflare Workers(幾乎零成本、腳本派)
什麼:用 Workers 的 Scheduled Triggers 跑每日 Cron,程式裡用 Service Account 連 Firestore,寄 SendGrid
優點:免費額度夠用、部署簡單、速度快
缺點:要自己寫連 Firestore 的邏輯;Scheduled Triggers 在免費方案可用,但配額有限
適合:不想綁 GCP 計費、又不排斥寫一點雲端腳本的人
C. 無程式/低程式方案(最省腦力)
IFTTT / Make / Zapier:用「每天」+「Gmail/SendGrid」直接寄信
優點:幾分鐘就能用;不用維護程式
缺點:要「跳過已有日記」這個條件就比較難,除非你把日記同步到 Google Sheets 然後用條件判斷(免費額度有限)
OneSignal Web Push(或 PWA 本機通知):
優點:可做推播(不用 Email),有免費層;
缺點:使用者要同意推播;瀏覽器沒開時 Web Push 要靠伺服器發(又回到要伺服器)
D. 最偷懶但超實用的「無後端提醒」
Google Calendar:建立每天提醒事件,描述放「寫日記」+ 網站連結
優點:真的 0 成本、幾乎不會壞
缺點:無法「今天已寫就不提醒」
我選 GitHub Actions + SendGrid Free:完全免費,還能在倉庫版控、可追蹤 Log
如果你要最穩最省心:選 Firebase Cloud Scheduler + Functions(但要綁卡,有免費額度)
如果你想省錢又少維運:選 Cloudflare Workers + SendGrid
如果你真的只想被提醒:直接 Google Calendar 事件 + 連結,兩分鐘搞定
不過這套完全免費的方案也有一個限制:提醒時間是全域統一的
換句話說,所有開啟提醒的使用者,都會在同一個時間收到信,暫時沒辦法做到「我想早上 8 點收」、「他想晚上 10 點收」這種個人化提醒
如果要進一步支援「每個用戶自訂提醒時間」,就得用進階方案:
目前我的需求是「全域每天提醒一次」就夠了,但如果要真正商業化,個人化提醒時間會是必須補強的功能
理論上 Day21 才會提部署,但我先嘗試把作品掛上去了
霓的情緒日記 歡迎點進去玩玩!
有什麼想法或建議都歡迎跟我說~(拜託不要攻擊我小小的網站 QQ)