如何在Node.js中使用imap将邮件正文与Base64附件存入同一JSON对象
解决方案
你之前用simpleParser拿不到附件的核心原因是fetch阶段只请求了邮件头部字段,没有拉取完整的邮件源内容,所以解析器无法识别附件数据,也就不需要单独走attributes相关逻辑获取附件。按如下方案修改即可直接拿到base64编码的附件内容,存入你需要的JSON对象:
核心修改点
- 调整fetch的bodies参数为
'RFC822'拉取完整邮件源 - simpleParser解析出的attachments数组内自带Buffer格式的附件内容,直接调用
toString('base64')即可得到你需要的编码结果
修正后完整代码
const mailList = []; // 存储所有解析完成的邮件JSON对象 var imap = new Imap(/* 替换为你的imap连接配置 */); imap.once('ready', function() { imap.openBox('INBOX', true, function(err, box) { if (err) throw err; // 拉取收件箱前3封邮件的完整内容 var f = imap.seq.fetch('1:3', { bodies: 'RFC822', // 核心修改:拉取完整邮件源,不再仅拉取头部 struct: false // 不需要struct属性,直接关闭即可 }); f.on('message', function(msg, seqno) { msg.on('body', function(stream, info) { // 传入邮件流到simpleParser解析 simpleParser(stream).then(parsed => { // 批量处理附件转base64 const formattedAttachments = parsed.attachments.map(attItem => { return { filename: attItem.filename || '未命名附件', contentType: attItem.contentType, size: attItem.size, base64Content: attItem.content.toString('base64') } }) // 组装符合你要求的JSON结构 const mail = { date: parsed.date, Subject: parsed.subject, Sender: parsed.from.value, Receiver: parsed.to.value, Attachment: formattedAttachments.length > 0 ? formattedAttachments : null } mailList.push(mail); // 可在此处添加后续存储逻辑 }).catch(parseErr => { console.error('第' + seqno + '封邮件解析失败:', parseErr); }) }); }); f.on('end', function() { console.log('所有邮件拉取解析完成,共' + mailList.length + '封'); imap.end(); }); f.on('error', function(fetchErr) { console.error('邮件拉取失败:', fetchErr); }) }); }); imap.connect();
注意事项
- 如果需要拉取的邮件体积较大,建议调整拉取范围分批处理,避免内存占用过高
- 该方案完全不需要处理
msg.once('attributes',...)相关逻辑,所有邮件数据可通过simpleParser一次解析得到
内容的提问来源于stack exchange,提问作者Nikki Gonzales
相关产品推荐
相关产品推荐

