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

使用nodemailer发送邮件能否直接附加jsPDF生成的对象作为附件?

解决方案

核心实现逻辑无需将生成的PDF写入本地磁盘,直接通过jsPDF内置的输出方法生成nodemailer支持的二进制格式数据,直接传入附件配置即可,全程在内存中完成,不会产生额外的IO开销,也不会占用多余算力。

步骤1:将jsPDF实例输出为可识别的二进制格式

你原有生成PDF的逻辑无需修改,仅需要把原来调用save()方法保存本地的逻辑,替换为output()方法输出指定格式:

const { jsPDF } = require("jspdf");
// 你的PDF生成原有逻辑
const doc = new jsPDF();
doc.text("测试PDF内容", 20, 20);
doc.setFontSize(12);
// 核心:输出为Node.js可直接使用的ArrayBuffer,全程在内存中生成
const pdfBuffer = doc.output("arraybuffer");

如果你的运行环境更适配base64格式,也可以输出为base64编码:

const pdfBase64 = doc.output("datauristring");

步骤2:配置nodemailer附件

nodemailer的附件配置原生支持直接传入content字段赋值二进制内容,不需要指定本地文件路径:

const nodemailer = require("nodemailer");

// 你的transporter原有配置无需修改
const transporter = nodemailer.createTransport({
  host: "smtp.example.com", // 替换为你的SMTP服务器地址
  port: 465,
  secure: true,
  auth: {
    user: "your-email@example.com",
    pass: "your-email-auth-code"
  }
});

const mailOptions = {
  from: "发件人 <your-email@example.com>",
  to: "收件人 <target@example.com>",
  subject: "带PDF附件的测试邮件",
  text: "邮件正文内容",
  attachments: [
    {
      filename: "自定义附件名称.pdf", // 收件人看到的附件文件名
      content: pdfBuffer, // 直接传入第一步生成的Buffer
      contentType: "application/pdf" // 明确指定文件类型避免识别异常
    }
    // 若使用base64格式,使用以下配置
    // {
    //   filename: "自定义附件名称.pdf",
    //   content: pdfBase64.split("base64,")[1],
    //   encoding: "base64",
    //   contentType: "application/pdf"
    // }
  ]
};

// 原有发送逻辑不变
transporter.sendMail(mailOptions, (err, info) => {
  if (err) return console.error("发送失败:", err);
  console.log("发送成功:", info.response);
});

原有方案失效原因说明

  • 直接传入jsPDF实例:nodemailer无法识别jsPDF的类实例结构,不知道该如何序列化该对象为邮件可识别的附件内容
  • 用JSON.stringify()处理jsPDF实例:该方法只能序列化对象的可枚举属性,无法提取PDF本身的二进制内容,所以生成的附件是空文件
  • 写入本地磁盘的方案完全没有必要,内存直接传输的性能远高于磁盘IO,也不会额外占用虚拟机的存储资源

内容的提问来源于stack exchange,提问作者Pedro Lucas De Moura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:08