如何在Strapi中通过entityService创建用户时发送确认邮件
解决Strapi自定义注册端点不发送确认邮件的问题
直接用entityService创建用户只会在数据库插入用户记录,不会触发users-permissions插件内置的注册流程(包括生成确认token、发送验证邮件)。要让自定义端点也发送确认邮件,你需要调用插件封装好的用户注册服务,而非直接操作实体。
修改后的控制器代码
async register(ctx) { try { const { firstName, lastName, nickname, email, phoneNumber, password, confirmPassword } = ctx.request.body; if (password !== confirmPassword) { ctx.badRequest('密码与确认密码不匹配'); return; } // 调用users-permissions插件的用户注册服务,自动处理邮件发送 const user = await strapi.plugin('users-permissions').service('user').add({ username: nickname, email: email, password: password, confirmed: false, // 强制设置为未确认,触发邮件发送(匹配插件配置逻辑) }); if (!user) { ctx.badRequest('用户创建失败'); return; } // 创建用户档案并关联到刚创建的用户 const userProfile = await strapi.entityService.create("api::user-profile.user-profile", { data: { nickname: nickname, first_name: firstName, last_name: lastName, phone_number: phoneNumber, user: user.id, // 关联到用户表,需确保user-profile模型已配置该关联字段 } }); if (!userProfile) { ctx.badRequest('用户档案创建失败'); return; } ctx.body = userProfile; } catch (err) { ctx.internalServerError(err.message); } }
关键说明
- 使用插件内置服务:
strapi.plugin('users-permissions').service('user').add()方法会自动执行以下操作:- 加密用户密码
- 生成邮箱确认token
- 根据插件配置发送确认邮件(前提是已在Strapi后台配置好邮件提供者,且启用了确认邮件模板)
- 关联用户与档案:创建
user-profile时通过user: user.id关联到新用户,需确保user-profile模型定义中已添加与plugin::users-permissions.user的关联字段(可在api/user-profile/models/user-profile.js的relations中配置)。 - 错误处理优化:替换原字符串返回,使用Strapi内置的
ctx.badRequest()和ctx.internalServerError()方法,符合框架响应规范。
前置检查
- 确保Strapi后台邮件配置正确(路径:Settings -> Email)
- 确认
users-permissions插件的邮箱确认功能已启用(路径:Settings -> Users & Permissions Plugin -> Advanced Settings) - 确认确认邮件模板已配置启用(路径:Settings -> Users & Permissions Plugin -> Email Templates -> Confirmation)
内容的提问来源于stack exchange,提问作者UnaiZelaia
相关产品推荐
相关产品推荐

