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

使用Gmail API发送PDF附件邮件异常:附件以文本形式发送

问题诊断与修复方案

我帮你看了下你的代码和收到的邮件内容,问题确实出在MIME邮件的格式构建上——你没有正确处理各个MIME段的换行符,并且选错了MIME类型,导致邮件客户端无法正确解析边界和内容,所有信息都挤在了一起。

核心问题分析

  1. 换行符缺失:你构建字符串数组时,很多MIME头和边界的末尾没有添加换行符nl,导致不同字段直接拼接在一起(比如收到的--_myapp_Content-Type: text/plain...就是因为--" + boundary后面没加换行)。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:59:01