使用Nodemailer提交表单数据至邮箱时req.body未定义的问题排查
解决方案:req.body未定义问题与邮件内容优化
问题根源
你遇到的req.body字段未定义的核心原因是:虽然引入了body-parser模块,但没有在Express应用中配置使用它,导致Express无法解析POST请求中的表单数据。
修复步骤
- 配置body-parser中间件:在Express应用中添加
body-parser的urlencoded解析器,因为你的表单是传统的application/x-www-form-urlencoded格式。 - 完善邮件内容拼接:把表单里的
from、to、date、time字段按你需要的格式组合到邮件文本中。
修改后的完整Node.js代码
var express = require('express'); var path = require('path'); var app = express(); var bodyParser = require('body-parser'); var nodemailer = require("nodemailer"); var smtpTransport = require('nodemailer-smtp-transport'); app.set('port', 3000); app.use(express.static(path.join(__dirname, 'public'))); // 关键:添加body-parser配置,解析表单数据 app.use(bodyParser.urlencoded({ extended: false })); var server = app.listen(app.get('port'), function() { var port = server.address().port; console.log('Magic happens on port ' + port); }); var smtpTransport = nodemailer.createTransport(smtpTransport({ service: 'Gmail', auth: { user: 'naomikudren@gmail.com', pass: '####' // 注意:建议用环境变量存储密码,不要硬编码 } })); app.post('/send-email', function(req, res) { // 拼接你需要的邮件文本格式 var emailContent = `From: ${req.body.from} To: ${req.body.to} Time: ${req.body.time} Date: ${req.body.date}`; var mailOptions = { from: '"Naomi" <naomikudren@gmail.com>', // sender address to: "naomikudren@gmail.com", // list of receivers subject: 'Request ', // Subject line text: emailContent // 使用拼接好的内容 }; smtpTransport.sendMail(mailOptions, function(error, info) { if (error) { return console.log(error); } console.log('Message sent: ' + info.response); }); res.redirect("/index.html"); });
额外注意事项
- 关于Gmail的密码:硬编码密码存在安全风险,建议使用应用专用密码(如果你的账号开启了2FA),或者通过环境变量(比如
process.env.GMAIL_PASSWORD)来读取密码。 - 表单验证:可以在前端或后端添加基础验证,确保所有字段都被填写后再发送请求,避免空值出现在邮件中。
内容的提问来源于stack exchange,提问作者Naomi
相关产品推荐
相关产品推荐

