Node.js环境下nodemailer调用ejs模板无法发送邮件问题咨询
问题排查与修复方案
1. 缺失ejs依赖导入
你当前代码中调用了ejs.renderFile但没有引入ejs模块,直接运行会抛出ejs is not defined报错,首先需要安装并导入ejs:
npm install ejs
在依赖导入部分添加:
import ejs from 'ejs' import path from 'path' // 后续处理模板路径需要
2. Gmail认证规则不兼容
当前你直接填写Gmail账号密码的方式已经不可用,谷歌早已关闭低安全应用登录权限,需要按以下要求配置:
- 先为你的Google账号开启两步验证
- 生成应用专用密码,将生成的16位专用密码替换到smtp配置的
pass字段即可。
3. ejs模板路径错误
你使用的相对路径./views/mail.ejs是相对于Node进程启动目录的,一旦启动目录变化就会找不到模板文件,建议换成绝对路径:
如果你的项目是ES模块规范(用了import语法),可以这样获取模板绝对路径:
const templatePath = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../views/mail.ejs') let output = await ejs.renderFile(templatePath, { test: 'Test'})
4. 异步逻辑与响应缺失
你当前的路由逻辑没有捕获异步错误,也没有给前端返回响应,容易出现请求超时、错误被吞的情况,建议把回调式的sendMail改成await调用,同时添加错误捕获和响应返回,另外邮件配置必须补充发件人字段,否则大部分服务商都会拦截邮件:
修正后的完整路由逻辑:
route.post('/',async(req, res)=> { try { const templatePath = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../views/mail.ejs') const output = await ejs.renderFile(templatePath, { test: 'Test'}) const mailOptions = { from: "example@gmail.com", // 发件人必须和你认证的邮箱保持一致 to : req.body.email, subject : "Please confirm your Email account", html : output } await smtpTransport.sendMail(mailOptions) console.log("Message sent") res.status(200).json({code:0, msg:'邮件发送成功'}) } catch (error) { console.log('发送失败错误:', error) res.status(500).json({code:1, msg:'邮件发送失败', error: error.message}) } })
5. 检查请求体解析配置
如果你没有在express入口配置JSON解析中间件,req.body.email会是undefined,也会导致发送失败,在你的express入口文件添加:
app.use(express.json())
内容的提问来源于stack exchange,提问作者Asif Kaif
相关产品推荐
相关产品推荐

