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:
- 如果是发送本地已有的合法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" } ], });
- 如果是动态生成PDF(比如用pdf-lib、pdfkit、puppeteer等库生成),必须等PDF完全生成、拿到完整的输出Buffer后再传入nodemailer,不要截取生成过程中的半截内容发送。
- 如果必须用base64格式传内容,要确保该base64字符串是从完整合法的PDF二进制内容转换而来,不要把普通文本、非PDF文件的内容转base64后硬套PDF后缀发送。
内容的提问来源于stack exchange,提问作者Bobox
相关产品推荐
相关产品推荐

