使用Gmail API发送含PDF附件的邮件时遭遇异常
问题原因分析
你遇到的问题核心是MIME格式不符合Gmail API的要求,具体两点:
- PDF、docx这类文件编码成Base64后内容较长,没有按MIME规范每76个字符换行,导致Gmail无法正确解析邮件结构。txt文件体积小,编码后内容短,刚好不会触发这个问题。
- 最终生成的
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 API
raw参数的强制要求,避免特殊字符导致的请求解析错误。
内容的提问来源于stack exchange,提问作者Hayri ZCAN BRF
相关产品推荐
相关产品推荐

