Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用base64编码的gmail send API时,ByteString错误的值无效<;或>;_Gmail - Fatal编程技术网

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

调用base64编码的gmail send API时,ByteString错误的值无效<;或>;,gmail,Gmail,我真的很坚持这一点,拼命想弄清楚该怎么办,到处找,什么都试了,但还是坚持不住。非常感谢您的帮助 因此,我调用Gmail发送消息API: 我传入以下base64编码的原始消息: VG86IGVJAG9ZAWDULNNMZGMUCWFAZ21HAWY29TDQPTDWJQZWN0OIBSZTOGDUGGF2ZSBHIGNGVB2WGCHJVZHVJDA0KSW4TUMBWBHKTVG86IDXDQUFMRNBBSMC1ATJLQ1P4T2DQWLHUDNNAN0J5M0GZNLRCMKNQYTOV

我真的很坚持这一点,拼命想弄清楚该怎么办,到处找,什么都试了,但还是坚持不住。非常感谢您的帮助

因此,我调用Gmail发送消息API:

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

VG86IGVJAG9ZAWDULNNMZGMUCWFAZ21HAWY29TDQPTDWJQZWN0OIBSZTOGDUGGF2ZSBHIGNGVB2WGCHJVZHVJDA0KSW4TUMBWBHKTVG86IDXDQUFMRNBBSMC1ATJLQ1P4T2DQWLHUDNNAN0J5M0GZNLRCMKNQYTOVETZH2BXZFT3DABFPBC5NBWFPBC5JB20+DQPSZWZWWZVZVZWZWZ0FBWZ0FBWZU8FKYZU8FKY2KZZWZZZY2KZZZY2ZZZZZZZZZZZZZZY2KZZZZZZZZZZZN9NZZZZZZZZZZZZZZZZZZZZZZZZZZZZ==

解码为:

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
To:echosign.sfdc。qa@gmail.com
主题:Re:我们有一款很酷的产品
答复:
参考资料:
11:36
我得到一个错误:

状态代码:400,状态:错误请求和响应:{“错误”:{“错误”:[{“域”:“全局”,“原因”:“无效”,“消息”:“ByteString的无效值”

问题在于回复和引用标题中的小于
和大于code>符号。我需要这些标题,因为我正试图将电子邮件作为回复发送到线程上。我试图省略
,但回复之后没有线程


如果您正在使用PHP,请尝试使用此方法(否则请尝试将其转换为您正在使用的任何语言)

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

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

Google API使用
urlsafe\u b64decode
进行解码。尝试使用
urlsafe\u b64encode
(使用URL安全字母表对字符串进行编码,该字母表使用
-
而不是
+
而不是标准Base64字母表中的
//code>)


在您的示例中,我看到一个
+
,这意味着您使用了标准的Base64。

之后,您通过
base64Encode
对消息内容进行编码,如下所示(假设使用谷歌脚本):

您必须转换所有
'/'
'+'
字符,这些字符不是“web安全的”,并将产生“ByteString的无效值”错误。您可以通过以下方式进行转换:

draftBody = draftBody.replace(/\//g,'_').replace(/\+/g,'-');

然后,您将其作为原始数据提交。显然,这里的消息内容没有失真。

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

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

base64url编码与base64编码不同


在python中,base64库提供了b64encode()和urlsafe_b64encode()。如果您不使用urlsafe_b64encode(),您将得到该错误,并非总是这样,因此它可能会通过一个简单的单元测试,但很快就会失败。

在Google应用程序脚本中,下面修复了该问题

var draftBody = Utilities.base64EncodeWebSafe(raw);

不要使用
var draftBody=Utilities.base64Encode(原始)

是url安全的base64编码的吗?我曾尝试用UTF-8将电子邮件编码为url安全的,但没有帮助。你知道我应该用什么替换,使其穿过电线吗?实际上,只需再次编辑它,如果编码,则它确实会发送过来,但回复没有显示为回复,不包括以前的对话。D这看起来对吗?致:echosign.sfdc。qa@gmail.com主题:回复:我们有一款很酷的产品:%3C089e01538a1223ee380506ab2157%40google.com%3E参考资料:%3C089e01538a1223ee380506ab2157%40google.com%3E这救了我一天!非常感谢!在golang有一种快速而肮脏的方法可以做到这一点(评论不会让我格式化为代码):b64:=base64.StdEncoding.EncodeToString(msg)b64=strings.Replace(b64,“+”,“-”,-1)b64=strings.Replace(b64,“-”,““,-1)message.Raw=strings.TrimRightFunc(b64,unicode.IsSpace)实际上,golang需要的只是
RawURLEncoding
,而不是
StdEncoding
:message.Raw:=base64.RawURLEncoding.EncodeToString(msg)For Java 8:base64.getUrlEncoder().EncodeToString(字节)
var draftBody = Utilities.base64EncodeWebSafe(raw);