Python解码Gmail API获取的邮件附件时遇Incorrect padding错误
解决Gmail API获取DMARC报告Base64解码的"Incorrect padding"错误
你的问题核心是Gmail API返回的Base64字符串中包含空格(或换行符)这类无效字符,这些字符会干扰Base64解码的padding校验,导致报错。
修复后的代码
import base64 import gzip import io # Base64 encoded gzip file(示例字符串) base64_gzip = "H4sIAAAAAAAAAKVTuW7cMBCt118RuJcoyl5bCzB0XKRMUrhLI1DUaJexeICkNsfXh5f2MIw0aSTOe6N584Yj8vRLzh-OYJ3Q6uMtrpvbJ3pDJoBxYPyV3mxIIWlTY4LWIOAWjLa-l-DZyDwL0IZou- 8Vk0Cfvzx___a1evn8QtAJjBkgmZip0c5L5jzYT0yyP1o5cDXXkqDMx8xSX4x07PCWtVtc8 YHz6v6ha6odG6AadtDhu2FiO94SdM6PX4eWoLdM7ZPshgywF4riR_zYdg_3TUNQRhIJakzUX SAjFeNYBF1VOUlcWCZGz4L_7s0yzMIdoIjr4EJRoSbtYM7GChZpNr4KSR1B-ZAgZ6aExHcEDLXwA7gnyKTYnQGXEcM9xbHbeIjApGmIwjO2-k5fYaJc29yh1T-zdacXy6EXhrbNru62dYu7ehv GeSZSHteLCnoE5UPCigYc2byEQaXK0b1w4X6Fj3uitILg_QIpOdG4YS5YXmeQTE4FLGM4G7kSCTeR-ydiBOXFJMJarld5hFkb6Cer5fUNXFMp-wBsBPtO7iWRBN8IEbb4Q2_BLbMvyhc-_n3_abfjh8V rCbLdUxWyjuC_yq3rhN70G9PyMoSNWX_2v5P8j0QNBAAA" # 第一步:移除所有非Base64有效字符(空格、换行等) valid_base64_chars = set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=") base64_gzip_cleaned = ''.join([c for c in base64_gzip if c in valid_base64_chars]) # 第二步:补充正确的padding missing_padding = len(base64_gzip_cleaned) % 4 if missing_padding: base64_gzip_cleaned += '=' * (4 - missing_padding) # 解码并解压 decoded_gzip = base64.b64decode(base64_gzip_cleaned) with gzip.GzipFile(fileobj=io.BytesIO(decoded_gzip)) as f: decompressed_data = f.read().decode('utf-8') print(decompressed_data)
问题分析
- Gmail API返回的Base64字符串可能因为传输或格式化原因混入空格、换行符,这些字符不属于Base64规范允许的范围,会导致解码时padding校验失败。
- 你之前的分段下载拼接操作没有清理这些无效字符,所以错误依然存在;而手动测试的小文件没有这类干扰字符,因此解码成功。
额外优化
如果确认Gmail API返回的是base64url编码(部分API会用这种变体),可以直接用base64.urlsafe_b64decode(),它会自动处理-和_替换为+和/,同时记得先清理无效字符:
# 若为base64url编码,替换字符后解码 base64_gzip_cleaned = base64_gzip_cleaned.replace('-', '+').replace('_', '/') decoded_gzip = base64.b64decode(base64_gzip_cleaned)
内容的提问来源于stack exchange,提问作者Adolfo Israel Ramírez Reséndiz
相关产品推荐
相关产品推荐

