Flutter系统中Firebase云调度函数触发及定时邮件发送咨询
核心方案:触发Firebase云调度函数实现每月发票邮件发送
一、整体逻辑梳理
你的场景核心链路是:Flutter端生成PDF发票并上传存储→Firebase云调度函数每月定时触发→读取Firestore中的日期/用户数据→获取对应PDF并发送邮件。下面重点讲云调度函数的触发配置及关联逻辑。
二、Firebase云调度函数的触发实现
1. 编写定时触发的云函数
使用Firebase Pub/Sub调度器配置定时规则,结合云函数完成邮件发送逻辑。以下是Node.js示例代码:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); const nodemailer = require("nodemailer"); admin.initializeApp(); // 配置邮件发送器(示例用SMTP,可替换成其他邮件服务) const transporter = nodemailer.createTransport({ service: 'Gmail', auth: { user: 'your-email@gmail.com', pass: 'your-app-password' } }); // 每月1号凌晨1点触发(时区设为业务所在时区) exports.sendMonthlyInvoice = functions.pubsub.schedule('0 1 1 * *') .timeZone('Asia/Shanghai') .onRun(async (context) => { // 1. 从Firestore获取已订阅用户及发票数据 const subscribedUsers = await admin.firestore() .collection('users') .where('isSubscribed', '==', true) .get(); // 2. 遍历用户发送邮件 for (const doc of subscribedUsers.docs) { const user = doc.data(); const invoiceDate = user.invoiceMonth; // 从Firestore取的日期数据 const pdfFilePath = `invoices/${doc.id}/${invoiceDate}.pdf`; // Flutter端上传的PDF路径 // 3. 从Storage读取PDF文件 const bucket = admin.storage().bucket(); const pdfFile = await bucket.file(pdfFilePath).download(); // 4. 构造邮件并发送 const mailOptions = { from: 'Your App <your-email@gmail.com>', to: user.email, subject: `你的${invoiceDate}订阅发票`, text: '附件是本月的订阅发票,请查收。', attachments: [{ filename: `${invoiceDate}-invoice.pdf`, content: pdfFile[0] }] }; await transporter.sendMail(mailOptions); } return null; });
2. 部署云函数
在本地终端执行部署命令:
firebase deploy --only functions:sendMonthlyInvoice
3. 验证触发配置
部署完成后,进入Firebase控制台的「云函数」→「触发器」页面,确认定时任务的触发时间、时区配置正确。
三、Flutter端的配合要求
- 生成PDF后,必须将文件上传至Firebase Storage,同时把发票日期、用户ID等关联数据写入对应用户的Firestore文档(比如
users/{uid}下新增invoiceMonth字段)。 - 确保Firestore中存储了用户的邮箱地址、订阅状态等关键信息,供云函数读取使用。
四、关键注意事项
- 时区设置要精准,避免触发时间与业务需求偏差。
- 邮件服务需配置合法的发件权限(比如Gmail需开启应用专用密码),同时注意邮件服务商的发送配额限制。
- 若用户量较大,需调整云函数的超时时间(默认60秒,最大可设为540秒),避免执行中断。
内容的提问来源于stack exchange,提问作者Mohamad Eizeddin
相关产品推荐
相关产品推荐

