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

如何让Nodemailer联系表单从提交邮箱而非认证邮箱发件?

问题分析与解决方案

你遇到的问题是Gmail SMTP服务的默认限制导致的——为了防范邮件伪造,Gmail会强制将from字段替换为你用于认证的邮箱(也就是example@gmail.com),不管你在代码里设置什么值。下面是几种可行的解决办法:

方法一:添加用户邮箱为Gmail别名(仅适用于固定发件人)

如果你只需要用少数几个固定邮箱作为发件人,可以在Gmail后台把这些邮箱添加为别名:

  • 登录example@gmail.com账号,进入「设置」→「账户和导入」
  • 找到「发送邮件为」,点击「添加另一个电子邮件地址」
  • 按照提示完成邮箱验证,验证通过后,你就能在mailOptions的from字段里使用这个邮箱了

但这个方法不适合动态获取用户提交邮箱的场景,因为你不可能提前把所有用户的邮箱都添加为别名。

方法二:使用replyTo字段(推荐用于动态用户邮箱)

这是更实用的方案:保持from字段为你的认证邮箱,但在邮件里显示用户的信息,同时设置replyTo为用户提交的邮箱,这样收件人回复时会直接发送到用户的邮箱。修改后的代码如下:

const transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: "example@gmail.com",
    pass: "你的应用专用密码", // 注意:开启两步验证的话必须用应用专用密码,不能用账号密码
  },
});

app.post("/api/send", (req, res) => {
  const { email, mobile, message } = req.body;
  const mailOptions = {
    from: `用户留言 <example@gmail.com>`, // 收件人看到的发件人显示
    replyTo: email, // 回复邮件时会发送到用户提交的邮箱
    to: "receiverEmail@gmail.com",
    subject: "Message from this App",
    text: `用户邮箱:${email}\n用户手机号:${mobile}\n留言内容:${message}`
  };

  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      return res.status(500).json(error); // 避免重复发送响应
    }
    res.status(200).json({
      message:"Message sent successfully" // 修正原拼写错误
    });
  });
});

方法三:更换支持自定义发件人的邮件服务

如果必须让收件人看到的发件人是用户提交的邮箱,可以换用SendGrid、Mailgun这类专业邮件服务:

  • 注册并配置你的域名,设置SPF和DKIM记录(服务商有详细教程)
  • 配置完成后,你可以在from字段里使用该域名下的任意邮箱,甚至是用户提交的邮箱(只要符合域名规则)

注意事项

  • Gmail现在要求开启两步验证的账号必须使用应用专用密码,不能直接用账号密码登录SMTP,你需要去Google账户后台生成应用专用密码。
  • 如果你强行伪造发件人邮箱(不通过别名或专业服务),邮件很大概率会被收件方的邮箱服务器标记为垃圾邮件,甚至直接拒收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:05:15