如何用Node.js通过Nodemailer发送数量可变的附件
用Nodemailer发送可变数量附件的实现方案
嘿,这个问题其实超容易解决的!nodemailer本身就支持直接传入一个附件数组,不管数组长度是多少都能自动处理,核心就是把你从JSON里拿到的附件数据转换成nodemailer需要的格式就行。我给你一步步拆解:
核心思路
nodemailer的attachments配置项本身就是一个数组,每个元素对应一个附件的配置对象。所以你只需要:
- 从JSON数据中提取包含附件信息的数组
- 将这个数组转换成nodemailer要求的附件格式
- 直接把转换后的数组传给
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
相关产品推荐
相关产品推荐

