使用base64编码的<或>调用gmail send API时,ByteString错误的值无效

Dan*_*man 19 gmail

真的卡在这一个上,拉着我的头发试图弄清楚要做什么,到处搜寻,尝试了一切,但仍然卡住了.任何帮助深表感谢.

所以我打电话给Gmail发送消息API:

https://www.googleapis.com/gmail/v1/users/me/messages/send

我传入以下base64编码的原始消息:

VG86IGVjaG9zaWduLnNmZGMucWFAZ21haWwuY29tDQpTdWJqZWN0OiBSZTogd2UgaGF2ZSBhIGNvb2wgcHJvZHVjdA0KSW4tUmVwbHktVG86IDxDQUFMRnBBSmc1aTJlQ1p4T2dQWlhUdnNaN0J5M0gzNlRCMkNQYTdoVEtzTXh2bXZfT3dAbWFpbC5nbWFpbC5jb20 + DQpSZWZlcmVuY2VzOiA8Q0FBTEZwQUpnNWkyZUNaeE9nUFpYVHZzWjdCeTNIMzZUQjJDUGE3aFRLc014dm12X093QG1haWwuZ21haWwuY29tPg0KDQoxMTozNg ==

哪个解码为:

To: echosign.sfdc.qa@gmail.com
Subject: Re: we have a cool product
In-Reply-To: <CAALFpAJg5i2eCZxOgPZXTvsZ7By3H36TB2CPa7hTKsMxvmv_Ow@mail.gmail.com>
References: <CAALFpAJg5i2eCZxOgPZXTvsZ7By3H36TB2CPa7hTKsMxvmv_Ow@mail.gmail.com>

11:36
Run Code Online (Sandbox Code Playgroud)

我收到错误:

状态代码:400和状态:错误请求和响应:{"error":{"errors":[{"domain":"global","reason":"invalid","message":"ByteString的值无效

问题是In-Reply-To和References标题中的符号小于<和大于>.我需要这些标题,因为我试图让电子邮件作为回复线程.我试图忽略<,>但回复然后没有线程.

谢谢

小智 25

来自Google的gmail rest api(发送消息):

"整个电子邮件消息采用RFC 2822格式化和base64url编码的字符串.当提供format = RAW参数时,在messages.get和drafts.get响应中返回."

base64 url编码与base64编码不同.

在python中,base64库提供了b64encode()和urlsafe_b64encode().如果你不使用urlsafe_b64encode(),你将得到该错误,而不是所有的时间,因此它可以通过一个简单的单元测试,但它会很快失败.

  • 对于Java 8:Base64.getUrlEncoder().encodeToString(bytes) (2认同)

ewe*_*ein 14

如果你正在使用PHP试试这个(否则尝试将其转换为你正在使用的任何语言)

在将mime消息设置为raw属性之前,请调用以下函数.

private function base64url_encode($mime) {
    return rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');
}
Run Code Online (Sandbox Code Playgroud)


Har*_*Das 6

在Google Apps脚本中修复了此问题

var draftBody = Utilities.base64EncodeWebSafe(raw);
Run Code Online (Sandbox Code Playgroud)

不要用 var draftBody = Utilities.base64Encode(raw);


小智 5

Google API使用解码urlsafe_b64decode。尝试使用urlsafe_b64encode(使用URL安全字母编码字符串,该字母在标准Base64字母中使用-代替+_代替/。)

在您的示例中,我看到一个+表示您使用标准Base64。