如何在Node.js中使用SendGrid发送带验证token的用户注册确认邮件
实现方案
步骤1:修改邮件发送模块代码
给sendMail函数新增两个入参,分别接收收件人邮箱和验证token,替换原硬编码内容,同时返回发送Promise方便上层捕获错误:
function sendMail(toEmail, verifyToken) { const msg = { to: toEmail, // 替换为传入的注册用户邮箱 from: "myemail@gmail.com", subject: "账户验证通知", text: `你的账户验证token为:${verifyToken},请前往系统完成账户验证`, // 替换为动态生成的token html: `<strong>你的账户验证token为:${verifyToken}</strong><br/>可直接点击链接完成验证:<a href="你的前端验证页面地址?token=${verifyToken}">立即激活账户</a>`, }; // 返回Promise供上层捕获发送结果 return sgMail .send(msg) .then(() => { console.log("Email sent"); }) .catch((error) => { console.error("邮件发送失败:", error); throw error; // 抛出错误让上层注册逻辑处理 }); } module.exports = { sendMail };
步骤2:修改注册接口代码
调用sendMail时传入当前注册用户的邮箱和生成的验证token,补充错误处理逻辑避免邮件发送失败仍返回注册成功的问题:
// 确认已在注册接口文件顶部导入sendMail // const { sendMail } = require('你的邮件模块文件相对路径'); router.post("/register", async (req, res) => { const { fullName, emailAddress, password } = req.body; try { const user = await Users.findOne({ where: { [Op.and]: [{ fullName: fullName }, { emailAddress: emailAddress }], }, }); if (user) { return res.status(400).send({ error: `当前用户名或邮箱已被注册`, }); } const hash = await bcrypt.hash(password, 10); const newUser = await Users.create({ fullName: fullName, emailAddress: emailAddress, password: hash, isVerified: false, }); const token = TokenGenerator.generate(); const creator = Verifications.belongsTo(Users, { as: "user" }); await Verifications.create( { token, user: newUser, }, { include: [creator], } ); // 传入用户邮箱和token调用邮件发送 await sendMail(newUser.emailAddress, token); return res.json("注册成功,请前往邮箱查收验证邮件完成账户激活"); } catch (error) { console.error("注册流程错误:", error); return res.status(500).send({ error: "注册失败,请稍后重试" }) } });
补充说明
- 如果你不想修改原有的链式Promise写法,只需要在原
sendMail()调用位置改为sendMail(user.emailAddress, token)即可 - 生产环境建议将发件人邮箱、验证域名等固定配置放到环境变量中,不要硬编码在业务代码里
内容的提问来源于stack exchange,提问作者user16364975
相关产品推荐
相关产品推荐

