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

如何基于Nodemailer实现用户提交咨询后的确认邮件发送

实现联系表单的双邮件通知:管理员收件 + 用户确认邮件

我正在搭建一个联系表单,需求是用户提交咨询后,我能收到咨询邮件,同时用户也能收到咨询已成功送达的确认邮件。目前已经用Nodemailer实现了管理员收件的功能,现在需要补充用户确认邮件的发送逻辑。

现有Nodemailer配置代码

//使用Nodemailer处理联系表单的邮件发送
router.post('/send', async(req, res) => {
  console.log(req.body);
  const transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
          user: process.env.EMAIL_USERNAME, //负责发送邮件的邮箱
          pass: process.env.EMAIL_PASSWORD
      }
  });
  const mailoptions = {
      from: process.env.FROM_EMAIL,
      to: process.env.EMAIL_USERNAME, //接收消息的邮箱
      subject: 'New Enquiry',
      html: `<html><body><p>Name: ${req.body.name}</p><p> Email: ${req.body.email}</p><p>message: ${req.body.content}</p></body></html>`
  }
  transporter.sendMail(mailoptions, (err, info) => {
      if (err) {
          console.log('error');
          res.send('message not sent'); //发送失败时
      } else {
          console.log('message sent' + info.response);
          res.send('sent'); //发送成功时
      }
  })
});

module.exports = router;

实现用户确认邮件的方案

步骤1:新增用户确认邮件配置

添加专门给用户发送的邮件配置,内容以友好告知为主:

// 用户确认邮件配置
const userConfirmationMailOptions = {
  from: process.env.FROM_EMAIL,
  to: req.body.email, // 取用户提交的邮箱地址
  subject: '咨询已收到,我们会尽快回复您',
  html: `
    <html>
      <body>
        <p>您好,${req.body.name}!</p>
        <p>我们已经收到您的咨询内容:</p>
        <p>${req.body.content}</p>
        <p>我们会在1-2个工作日内回复您,请留意邮箱动态。</p>
        <p>感谢您的咨询!</p>
      </body>
    </html>
  `
};

步骤2:重构发送逻辑,保证双邮件发送顺序

用async/await替代回调函数,确保管理员邮件和用户确认邮件按顺序发送,同时统一处理异常:

router.post('/send', async(req, res) => {
  console.log(req.body);
  const transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
          user: process.env.EMAIL_USERNAME,
          pass: process.env.EMAIL_PASSWORD
      }
  });

  // 管理员收件邮件配置
  const adminMailOptions = {
      from: process.env.FROM_EMAIL,
      to: process.env.EMAIL_USERNAME,
      subject: 'New Enquiry',
      html: `
        <html>
          <body>
            <p>Name: ${req.body.name}</p>
            <p>Email: ${req.body.email}</p>
            <p>Message: ${req.body.content}</p>
          </body>
        </html>
      `
  };

  // 用户确认邮件配置
  const userConfirmationMailOptions = {
    from: process.env.FROM_EMAIL,
    to: req.body.email,
    subject: '咨询已收到,我们会尽快回复您',
    html: `
      <html>
        <body>
          <p>您好,${req.body.name}!</p>
          <p>我们已经收到您的咨询内容:</p>
          <p>${req.body.content}</p>
          <p>我们会在1-2个工作日内回复您,请留意邮箱动态。</p>
          <p>感谢您的咨询!</p>
        </body>
      </html>
    `
  };

  try {
    // 先发送管理员邮件
    await transporter.sendMail(adminMailOptions);
    console.log('管理员邮件发送成功');
    // 再发送用户确认邮件
    await transporter.sendMail(userConfirmationMailOptions);
    console.log('用户确认邮件发送成功');
    res.send('sent');
  } catch (err) {
    console.error('邮件发送失败:', err);
    res.send('message not sent');
  }
});

module.exports = router;

关键注意点

  • 确保前端表单中用户邮箱对应的input标签name属性为email,保证req.body.email能正确取值。
  • 使用Gmail时,若开启了两步验证,需生成应用专用密码替代原邮箱密码;未开启两步验证的话,需暂时开启Google账号的「低安全性应用访问」权限。
  • 可根据业务需求调整确认邮件的内容,比如添加品牌logo、客服联系方式等,提升用户体验。

内容的提问来源于stack exchange,提问作者sultan.h

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:10:31