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

使用Nodemailer+Angular开发联系表单时发件人显示异常求助

问题:Nodemailer发送邮件时发件人与收件人显示一致

我在做一个小型训练项目的联系表单,用Angular+Nodemailer实现,邮件能正常收到,但Gmail里显示的发件人和收件人是同一个邮箱。表单填写正常,服务器日志也显示拿到了正确的用户数据,请问哪里出问题了?


问题原因与解决办法

核心原因

Gmail的SMTP服务有严格的反伪造限制:不管你设置sender还是from字段,若未配置授权发件人,Gmail会强制将发件人替换为你用来SMTP认证的邮箱地址。如果你的收件人正好也是这个认证邮箱,就会出现发件人和收件人显示一致的情况。

正确解决方案

  1. 替换sender为from,设置显示用的发件人信息
    用from字段设置用户的姓名和邮箱(格式:"用户名" <用户邮箱>),Gmail会保留这个显示信息,但实际发件还是你的认证邮箱,既符合Gmail规则,又能让你看到是谁发的邮件。
  2. 添加replyTo字段
    把replyTo设为用户的邮箱,这样你回复邮件时会自动指向用户的邮箱,不会回复到你的认证邮箱。
  3. 修复原代码的语法错误
    原sendEmail函数里嵌套了重复的函数定义,这会导致逻辑混乱,必须先修复。

修正后的代码

1. 修复后的Nodemailer发送函数

async function sendEmail(data, callback) {
  const transporter = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 587,
    service: "gmail",
    auth: {
      user: "你的SMTP认证邮箱前缀(不带@gmail.com)",
      pass: "你的Google第三方应用密码"
    }
  });

  const mailOptions = {
    // 显示用户的发件人信息
    from: `${data.name} <${data.email}>`,
    to: "你的收件邮箱(比如就是认证邮箱)",
    subject: data.subject,
    // 回复时指向用户邮箱
    replyTo: data.email,
    html: `
      <h2>发送人:</h2>
      <div>${data.name} (${data.email})</div>
      <h2>主题:</h2>
      <div>${data.subject}</div>
      <h2>咨询内容:</h2>
      <div>${data.query}</div>
    `
  };

  try {
    const info = await transporter.sendMail(mailOptions);
    callback(info);
  } catch (error) {
    callback(error);
  }
}

module.exports = { sendEmail };

2. 修正后的服务器控制器

emailController.post(`/contact-us`, async (req, res) => {
  console.log(`请求已接收`);
  const user = req.body;

  try {
    await new Promise((resolve, reject) => {
      sendEmail(user, (result) => {
        if (result instanceof Error) {
          reject(result);
        } else {
          resolve(result);
        }
      });
    });
    res.status(200).json({ message: "邮件发送成功" });
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});

额外说明

  • 原控制器里直接调用res.end()会导致请求在邮件发送完成前就结束,改成异步处理后能确保响应时机正确;
  • 如果需要让用户邮箱作为实际发件人,你需要在Gmail后台配置该邮箱为授权发件人,但对于小型项目来说,用from+replyTo的方案足够满足需求。

内容的提问来源于stack exchange,提问作者TheBoomstick7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:35:27