邮件附件的内容按 MIME 每 76 个字符折行,前端 atob 直接抛 InvalidCharacterError: Invalid character。把换行删掉再解就正常了。乍看像缓存或者权限的锅,追下去往往不是。
python3 -c "import base64;d=open('a.b64').read();print(len(base64.b64decode(''.join(d.split()))))"
tr -d '\r\n' a.b64 > a.one.b64
追下去是这么回事:MIME 规定 base64 允许折行,换行属于格式的一部分,读取时应当忽略。不少运行时只接受连续的字母表字符,碰到 \r\n 就判成非法输入,长度校验也会跟着报错。
「Base64 换行符」这类改动最怕改一半,回滚脚本先准备好,再动生产。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
监控和日志的时间要对上,时区不一致会多绕很大一圈。
具体做法是,解码前把 \r \n 和空格全部去掉 再补齐等号;确认长度是 4 的倍数 缺几位补几个 =;用标准库解码 别自己按 6 位手切;服务端输出用不带折行的单行 base64。
验收就看一点,解码不再抛错 输出字节数和原附件大小一致。
