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

如何用Node.js通过Nodemailer发送数量可变的附件

用Nodemailer发送可变数量附件的实现方案

嘿,这个问题其实超容易解决的!nodemailer本身就支持直接传入一个附件数组,不管数组长度是多少都能自动处理,核心就是把你从JSON里拿到的附件数据转换成nodemailer需要的格式就行。我给你一步步拆解:

核心思路

nodemailer的attachments配置项本身就是一个数组,每个元素对应一个附件的配置对象。所以你只需要:

  1. 从JSON数据中提取包含附件信息的数组
  2. 将这个数组转换成nodemailer要求的附件格式
  3. 直接把转换后的数组传给attachments字段即可

完整代码示例

第一步:模拟从JSON获取数据

假设你的JSON数据里包含邮件内容和附件列表(实际场景中可以是读取本地JSON文件、调用API获取等):

// 模拟从JSON获取的数据源
const emailConfigFromJSON = {
  subject: "月度数据报告",
  body: "这是本月的数据分析报告,附件包含详细表格和可视化图",
  attachments: [
    { fileName: "月度销售数据.xlsx", fileLocation: "./assets/sales-data.xlsx" },
    { fileName: "用户画像报告.pdf", fileLocation: "./assets/user-profile.pdf" },
    { fileName: "趋势图表.png", fileLocation: "./assets/trend-chart.png" }
  ]
};

第二步:转换为Nodemailer兼容的附件格式

用map方法遍历JSON里的附件数组,转换成nodemailer需要的结构:

// 转换附件格式
const processedAttachments = emailConfigFromJSON.attachments.map(attach => {
  return {
    filename: attach.fileName, // 邮件中显示的附件名称
    path: attach.fileLocation   // 本地文件路径(也可以用content传文件内容,或href传在线链接)
  };
});

第三步:完整的邮件发送代码

把转换好的附件数组传入nodemailer的发送配置:

const nodemailer = require('nodemailer');

// 创建邮件传输器(这里以Gmail为例,其他邮箱调整配置即可)
const transporter = nodemailer.createTransport({
  service: 'Gmail',
  auth: {
    user: 'your-email@gmail.com',
    pass: 'your-app-password' // 注意:Gmail需要启用应用密码,不是登录密码
  }
});

// 邮件配置项
const mailOptions = {
  from: 'your-email@gmail.com',
  to: 'recipient@example.com',
  subject: emailConfigFromJSON.subject,
  text: emailConfigFromJSON.body,
  attachments: processedAttachments // 直接传入可变长度的附件数组
};

// 发送邮件
transporter.sendMail(mailOptions, (err, info) => {
  if (err) {
    console.error('邮件发送失败:', err);
  } else {
    console.log('邮件发送成功:', info.response);
  }
});

额外注意事项

  • 文件路径正确性:确保path指向的文件存在,否则nodemailer会抛出文件找不到的错误
  • 附件格式灵活性:如果你的JSON里存的不是本地文件路径,而是base64内容或在线链接,可以调整转换逻辑:
    // 示例:处理base64格式的附件
    {
      filename: "logo.png",
      content: attach.base64Content,
      encoding: 'base64'
    }
    // 示例:处理在线链接附件
    {
      filename: "官方文档.pdf",
      href: attach.documentUrl
    }
    
  • 邮箱服务配置:不同邮箱服务商的SMTP配置不同,比如QQ邮箱需要设置host: 'smtp.qq.com'和port: 465,并开启SMTP权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:19:13