基于Flutter实现Strapi新增条目时发送邮件通知方案问询
两种实现方案详解
方案一:Flutter接收通知 + 后端发送邮件(满足你需要Flutter参与通知的需求)
步骤1:实现用户订阅流程
- 在Strapi后台创建
subscribers集合,添加email(必填)、device_token(可选,用于推送通知)两个字段 - Flutter端用户点击「接收邮件通知」后,调用Strapi的
POST /api/subscribers接口,提交用户邮箱和设备的推送令牌(如FCM令牌)
步骤2:Strapi配置Webhook触发通知
- 进入Strapi后台「设置」→「Webhooks」,新建Webhook
- 触发事件选择
email.create(当email集合新增条目时触发) - 目标URL填写你的后端服务接口(比如
https://your-backend.com/trigger-email)—— 因为Flutter客户端是动态设备,无法作为固定接收端点,必须通过后端中转
步骤3:后端处理通知与邮件发送
- 后端收到Strapi的Webhook请求后,提取新
email条目的内容(比如图片URL、标题等) - 调用Strapi的
GET /api/subscribers接口获取所有订阅用户的邮箱列表 - 调用第三方邮件服务(如SendGrid、Mailgun)的API批量发送邮件,同时调用FCM/APN接口给订阅的Flutter设备推送通知
步骤4:Flutter端接收通知
- 集成FCM/APN推送SDK,接收后端发来的通知并展示给用户
方案二:Strapi全流程处理(无需改动Flutter)
这种方案更省心,所有逻辑都在Strapi内部完成,Flutter只需要保留提交订阅邮箱的接口调用即可。
步骤1:准备Strapi环境
- 创建订阅用户集合:在Strapi后台新建
subscribers集合,仅需email字段 - 安装并配置邮件插件:
- 执行命令安装插件:
npm install @strapi/plugin-email(或yarn) - 在
config/plugins.js中配置邮件服务(以SendGrid为例):module.exports = { email: { config: { provider: 'sendgrid', providerOptions: { apiKey: process.env.SENDGRID_API_KEY, // 从环境变量读取密钥 }, settings: { defaultFrom: 'your-notify-email@example.com', defaultReplyTo: 'your-notify-email@example.com', }, }, }, }; - 在Strapi后台「设置」→「邮件插件」中测试配置是否正常
- 执行命令安装插件:
步骤2:添加生命周期钩子自动发邮件
在Strapi项目的src/api/email/content-types/email/lifecycles.js文件中添加以下代码,当email集合新增条目时自动给所有订阅用户发邮件:
module.exports = { async afterCreate(event) { const { result } = event; // 获取所有订阅用户的邮箱 const subscribers = await strapi.entityService.findMany('api::subscriber.subscriber', { fields: ['email'], }); // 批量发送邮件(用户量大建议用队列异步处理) for (const subscriber of subscribers) { await strapi.plugins['email'].services.email.send({ to: subscriber.email, from: 'your-notify-email@example.com', subject: '新图片内容更新', html: `<h3>新增了一张图片</h3><img src="${result.image.url}" style="max-width: 600px;" alt="新图片">`, }); } }, };
注意:如果你的
image,要替换成实际字段名;用户量较大时,建议集成BullMQ等队列工具异步处理邮件发送,避免阻塞Strapi请求。
步骤3:Flutter端仅需保留订阅逻辑
Flutter端用户点击订阅后,调用Strapi的POST /api/subscribers接口提交邮箱即可,后续所有通知流程都由Strapi自动完成。
通用注意事项
- 邮件服务优先选择第三方服务商(SendGrid、Mailgun),比自建SMTP更稳定,降低邮件被标记为垃圾邮件的概率
- 配置Strapi接口权限时,确保
subscribers集合的POST接口仅对未登录用户开放(如果不需要用户认证),email集合的GET接口保持原有权限供Flutter获取图片 - 批量发送邮件时,务必遵守邮件服务商的发送频率限制,避免被封号
内容的提问来源于stack exchange,提问作者lemon-dev
相关产品推荐
相关产品推荐

