You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:39:01