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

使用Gmail API发送含PDF附件的邮件时遭遇异常

问题原因分析

你遇到的问题核心是MIME格式不符合Gmail API的要求,具体两点:

  1. PDF、docx这类文件编码成Base64后内容较长,没有按MIME规范每76个字符换行,导致Gmail无法正确解析邮件结构。txt文件体积小,编码后内容短,刚好不会触发这个问题。
  2. 最终生成的raw参数使用了标准Base64编码,而Gmail API要求的是URL安全的Base64编码(替换+为-、/为_,移除末尾的=)。
解决方案

修改代码中的两处关键部分:

1. 给Base64编码的附件内容添加换行

新增一个处理函数,确保Base64编码的内容每76字符换一行:

function base64WithLineBreaks(binaryData) {
    var base64Str = binaryEncode(binaryData, "base64");
    var chunked = [];
    for (var i=1; i<=len(base64Str); i+=76) {
        arrayAppend(chunked, mid(base64Str, i, 76));
    }
    return arrayToList(chunked, chr(13)&chr(10));
}

然后在构建mimeMessage时,用这个函数替换原来的binaryEncode调用:

// 替换所有附件的binaryEncode为base64WithLineBreaks
base64WithLineBreaks(attachment1FileContent)
base64WithLineBreaks(attachment2FileContent)
base64WithLineBreaks(attachment3FileContent)

2. 转换为URL安全的Base64编码

替换生成rawMessage的代码:

// 原代码:rawMessage = toBase64(mimeText);
// 修改为:
rawMessage = replace(replace(toBase64(mimeText), "+", "-", "all"), "/", "_", "all");
rawMessage = reReplace(rawMessage, "=+$", "", "all");

修改后的关键代码片段

// 新增Base64换行处理函数
function base64WithLineBreaks(binaryData) {
    var base64Str = binaryEncode(binaryData, "base64");
    var chunked = [];
    for (var i=1; i<=len(base64Str); i+=76) {
        arrayAppend(chunked, mid(base64Str, i, 76));
    }
    return arrayToList(chunked, chr(13)&chr(10));
}

// ... 其他原有代码不变 ...

// 构建mimeMessage时替换binaryEncode
mimeMessage = [
    "MIME-Version: 1.0",
    "to: " & toEmail,
    "subject: " & subject,
    "Content-Type: multipart/mixed; boundary=" & boundary,
    "",
    "--" & boundary,
    "Content-Type: text/plain; charset=UTF-8",
    "Content-Disposition: inline",
    "",
    bodyText,
    "",
    "--" & boundary,
    "Content-Type: application/octet-stream; name=""" & attachment1FileName & """",
    "Content-Transfer-Encoding: base64",
    "Content-Disposition: attachment; filename=""" & attachment1FileName & """",
    "",
    base64WithLineBreaks(attachment1FileContent),
    "",
    "--" & boundary,
    "Content-Type: application/octet-stream; name=""" & attachment2FileName & """",
    "Content-Transfer-Encoding: base64",
    "Content-Disposition: attachment; filename=""" & attachment2FileName & """",
    "",
    base64WithLineBreaks(attachment2FileContent),
    "",
    "--" & boundary,
    "Content-Type: application/pdf; name=""" & attachment3FileName & """",
    "Content-Transfer-Encoding: base64",
    "Content-Disposition: attachment; filename=""" & attachment3FileName & """",
    "",
    base64WithLineBreaks(attachment3FileContent),
    "--" & boundary & "--"
];

// 生成符合要求的raw参数
mimeText = arrayToList(mimeMessage, chr(13) & chr(10));
rawMessage = replace(replace(toBase64(mimeText), "+", "-", "all"), "/", "_", "all");
rawMessage = reReplace(rawMessage, "=+$", "", "all");
验证说明
  • 换行处理符合RFC 2045规范,确保Gmail能正确解析邮件的MIME结构。
  • URL安全的Base64编码是Gmail APIraw参数的强制要求,避免特殊字符导致的请求解析错误。

内容的提问来源于stack exchange,提问作者Hayri ZCAN BRF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:20:55