如何在node-imap中为草稿邮件添加附件并保存?
解决方案
要给草稿邮件添加附件,你需要调整邮件的MIME结构——将原有的multipart/alternate改为multipart/mixed(该类型支持同时包含文本内容和附件),然后将附件文件编码为Base64并封装成对应的MIME实体,最终和文本内容一起添加到主邮件实体中。
以下是完整的可运行代码示例:
const imap = require('node-imap'); const mimemessage = require('mimemessage'); const fs = require('fs'); const path = require('path'); imap.once('ready', () => { imap.openBox('Drafts', false, (err, box) => { if (err) throw err; // 1. 创建纯文本和HTML内容的交替实体(保留原文本逻辑) const alternateMsg = mimemessage.factory({ contentType: 'multipart/alternate', body: [] }); const htmlEntity = mimemessage.factory({ contentType: 'text/html;charset=utf-8', body: 'Draft Mail' }); const plainEntity = mimemessage.factory({ body: 'Draft Mail' }); alternateMsg.body.push(plainEntity); alternateMsg.body.push(htmlEntity); // 2. 处理附件:读取文件并编码为Base64 const attachmentPath = path.resolve(__dirname, 'your-attachment.pdf'); // 替换为你的附件路径 const attachmentBuffer = fs.readFileSync(attachmentPath); const attachmentBase64 = attachmentBuffer.toString('base64'); const attachmentEntity = mimemessage.factory({ contentType: 'application/pdf; name="your-attachment.pdf"', // 根据附件类型修改Content-Type body: attachmentBase64, encoding: 'base64' }); // 设置附件的处置头,指定文件名 attachmentEntity.header('Content-Disposition', `attachment; filename="your-attachment.pdf"`); // 3. 创建主邮件实体(混合类型:文本+附件) const msg = mimemessage.factory({ contentType: 'multipart/mixed', body: [] }); msg.header('Message-ID', '<msgId>'); msg.header('To','email@domain.com'); msg.header('Subject', 'Mail'); msg.body.push(alternateMsg); // 添加文本内容部分 msg.body.push(attachmentEntity); // 添加附件部分 // 4. 将邮件追加到草稿箱 imap.append(msg.toString(), (appendErr) => { if (appendErr) throw appendErr; console.log('带附件的草稿已保存'); imap.end(); }); }); });
关键说明
- MIME结构调整:
multipart/alternate仅用于纯文本和HTML内容的切换展示,而multipart/mixed允许同时包含不同类型的内容(文本、附件等),因此必须修改主实体的contentType。 - 附件处理:
- 读取附件文件转为Buffer,再编码为Base64(SMTP/IMAP传输附件的标准编码方式)
- 根据附件的实际类型设置正确的
Content-Type(比如图片用image/png,Word文档用application/vnd.openxmlformats-officedocument.wordprocessingml.document等) - 通过
Content-Disposition头指定附件的文件名和展示方式(attachment表示作为附件下载)
- 错误处理:示例中保留了基础的错误抛出,实际生产环境建议替换为更友好的错误捕获逻辑。
内容的提问来源于stack exchange,提问作者user3653474
相关产品推荐
相关产品推荐

