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

使用nodemailer从MySQL取数批量发邮件报No recipients defined如何解决

问题根因
  • 异步逻辑顺序错误:db.query为异步执行方法,你将邮件构造、发送逻辑写在查询回调之外,代码执行时还未拿到数据库返回的邮箱列表,就已经触发了发送操作。
  • 参数赋值错误:你直接把SQL查询语句字符串赋值给了emails变量,并将其作为收件人参数传给to字段,nodemailer无法识别到有效的收件人地址,因此抛出No recipients defined错误。
修复实现代码

直接将邮件构造、发送逻辑放到数据库查询的回调内部,处理查询结果得到有效邮箱列表后再执行发送:

// 定义查询邮箱的SQL语句
const getEmailSql = `select email from users`
// 执行数据库查询
db.query(getEmailSql, (err, results, fields) => {
  if (err) {
    console.log('邮箱列表查询失败:', err)
    return
  }
  // 提取查询结果中的邮箱地址,生成邮箱数组
  const emailList = results.map(row => row.email)
  // 构造邮件配置
  const mailOptions = {
    from: 'h.codetests@outlook.com',
    to: emailList, // nodemailer支持直接传邮箱数组,也可以用emailList.join(',')转为逗号分隔的字符串
    subject: 'nodemailer test', 
    text: 'noooooodemailer test'
  }
  // 执行发送
  transporter.sendMail(mailOptions, (err, info) => {
    if (err) {
      console.log('发送失败:', err)
      return
    }
    console.log(`发送成功:${info.response}`)
  })
})
批量发送优化方案
  • 如果你不想让所有收件人互相看到对方的邮箱地址,把to字段替换为bcc字段,将邮箱列表放到密送位即可。
  • 如果需要给每个收件人发送个性化内容,遍历邮箱列表逐个发送即可,大量发送时建议加发送间隔控制,避免触发邮件服务商的频率限制导致账号被封禁。
  • 可以新增发送状态记录逻辑,把每个邮箱的发送结果存回数据库,方便后续针对发送失败的地址重发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:09:00