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

nodemailer发送PDF附件成功但无法加载打开问题咨询

问题原因

核心原因是你发送的附件根本不是合法的PDF文件,只是套了PDF后缀、设置了PDF的MIME类型的普通文本文件:

  • 你代码里将纯字符串"Hello World"转成base64就作为PDF附件内容发送,但PDF是有严格格式规范的二进制文件,必须包含固定的文件头(%PDF-开头)、对象结构、交叉引用表、文件尾等标准结构,才能被PDF阅读器正常解析。
  • 你传入的内容本质是纯文本,完全不符合PDF格式规范,阅读器解析时找不到合法的PDF结构,自然会报「Failed to load PDF document」错误。
  • 额外注意:你注释里打印的base64值HelloWorlQ==本身就是异常的,正常Buffer.from("Hello World").toString('base64')输出应为SGVsbG8gV29ybGQ=,如果实际运行时拿到的base64是你标注的短值,说明你读取文件/生成内容时存在截断、编码错误,也会进一步导致附件损坏。
修复方法

只需要保证传入attachments.content字段的是完整合法的PDF文件对应的Buffer或正确编码的base64字符串即可,不要用非PDF内容强行伪装成PDF:

  1. 如果是发送本地已有的合法PDF文件,直接读取文件Buffer传入即可,不需要手动做base64转换,参考代码:
const fs = require('fs/promises');

// 读取本地真实存在的有效PDF文件
const validPdfContent = await fs.readFile('./your-real-document.pdf');

let info = await transporter.sendMail({
  from: 'test5@gmail.com',
  to: "test@gmail.com",
  subject: "test",
  attachments: [
    {
      filename: 'text1.pdf',
      content: validPdfContent,
      contentType: "application/pdf"
    }
  ],
});
  1. 如果是动态生成PDF(比如用pdf-lib、pdfkit、puppeteer等库生成),必须等PDF完全生成、拿到完整的输出Buffer后再传入nodemailer,不要截取生成过程中的半截内容发送。
  2. 如果必须用base64格式传内容,要确保该base64字符串是从完整合法的PDF二进制内容转换而来,不要把普通文本、非PDF文件的内容转base64后硬套PDF后缀发送。

内容的提问来源于stack exchange,提问作者Bobox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:36:18