如何基于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
相关产品推荐
相关产品推荐

