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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:36:00