使用Gmail API发送PDF附件邮件异常:附件以文本形式发送
问题诊断与修复方案
我帮你看了下你的代码和收到的邮件内容,问题确实出在MIME邮件的格式构建上——你没有正确处理各个MIME段的换行符,并且选错了MIME类型,导致邮件客户端无法正确解析边界和内容,所有信息都挤在了一起。
核心问题分析
- 换行符缺失:你构建字符串数组时,很多MIME头和边界的末尾没有添加换行符
nl,导致不同字段直接拼接在一起(比如收到的--_myapp_Content-Type: text/plain...就是因为--" + boundary后面没加换行)。 - MIME类型错误:
multipart/alternate是用于提供不同格式的邮件正文(比如纯文本版和HTML版),如果要带附件,应该使用multipart/mixed类型,它允许同时包含正文和附件。
修正后的代码
var boundary = "__myapp__", nl = "\n"; var fileName = "abc.pdf"; var attach = new Buffer(fs.readFileSync("./" + fileName)).toString("base64"); // 构建正确的MIME邮件结构 var str = [ "MIME-Version: 1.0" + nl, "Content-Type: multipart/mixed; boundary=\"" + boundary + "\"" + nl, "to: " + to + nl, "subject: " + subject + nl + nl, // 空行分隔邮件头和正文 // 第一个MIME段:纯文本正文 "--" + boundary + nl, "Content-Type: text/plain; charset=UTF-8" + nl, "Content-Transfer-Encoding: 7bit" + nl + nl, // 空行分隔头和内容 message + nl + nl, // 第二个MIME段:PDF附件 "--" + boundary + nl, "Content-Type: application/pdf; name=\"myPdf.pdf\"" + nl, "Content-Disposition: attachment; filename=\"myPdf.pdf\"" + nl, "Content-Transfer-Encoding: base64" + nl + nl, // 空行分隔头和base64内容 attach + nl, // 结束边界 "--" + boundary + "--" ].join(''); var encodedMail = new Buffer(str).toString("base64") .replace(/\+/g, '-') .replace(/\//g, '_'); resolve(encodedMail);
关键修改说明
- 把
multipart/alternate改成了multipart/mixed,这是带附件邮件的标准MIME类型。 - 每个MIME头字段、边界、内容段之间都添加了正确的换行符
nl,尤其是MIME头和内容之间必须有一个空行(也就是两个nl),这是MIME格式的强制要求。 - 给文件名和边界添加了双引号,避免特殊字符导致解析错误。
- 调整了邮件头的顺序,把
MIME-Version和Content-Type放在前面,符合邮件规范。
验证效果
修正后,收到的邮件内容会正确分隔各个部分,邮件客户端能识别出纯文本正文和PDF附件,不会再出现内容挤在一起的情况。
内容的提问来源于stack exchange,提问作者ANURAG GUPTA
相关产品推荐
相关产品推荐

