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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:05:08