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

为什么我通过Nodemailer接收的联系表单邮件内容显示undefined?

问题根因及修复方案

1. 表单提交数据无法被解析,导致req.body字段全部为undefined

你的联系表单设置了enctype = "multipart/form-data",该编码格式仅用于表单包含文件上传的场景,express内置的express.urlencoded、express.json中间件都无法解析该格式的请求体,所以你拼接邮件内容时取到的所有字段都是undefined。

修复方式二选一:

  • 方案1:直接删除form标签里的enctype = "multipart/form-data"属性即可,普通表单用默认的application/x-www-form-urlencoded编码就能被正常解析。
  • 方案2:如果后续需要在联系表单增加文件上传功能,给/send接口加上multer的无文件解析中间件:
// 在/send接口定义前新增这行
const uploadNone = multer().none()
// 接口改造如下
app.post('/send', uploadNone, (req, res) => {
  // 原有逻辑保持不变
})

2. 邮件发送回调变量名错误

你在transporter.sendMail的回调里参数定义为(err, data),但后续错误判断用的是未定义的error变量,打印日志用的是未定义的info变量,会导致发送报错时日志无法正常输出,也可能引发逻辑异常。

修复方式:

把回调逻辑替换为如下内容:

transporter.sendMail(mailOptions, function (err, info) {
  if (err) {
    return console.log(err);
  }
  console.log('Message sent: %s', info.messageId);   
  console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
});

3. 其他潜在问题(可选修复)

根路由app.get('/',( req, res) => { res.sendFile('/index.html') })的路径写法不符合要求,sendFile需要传入绝对路径,建议修改为:

res.sendFile(__dirname + '/public/index.html')

可选优化

你当前定义的全局变量subject、body、path存在并发安全问题,多个用户同时提交文档请求时会出现变量互相覆盖的情况,建议把这三个变量移到/sendemail接口的upload回调内部定义,不要使用全局变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:15:01