我正在努力寻找一个很好的例子,说明通过Gmail API发送包含大于10mb附件的电子邮件所必需的全部请求。
我见过https://developers.google.com/gmail/api/v1/reference/users/messages/send和https://developers.google.com/gmail/api/guides/uploads#resumable,但是没有什么可以将它们联系在一起的。
我们正在使用ruby客户端,但是无法完成此流程。使用以下代码,我们在尝试发出第二个请求时遇到以下错误:Google::APIClient::ClientError: Recipient address required
响应的全文如下:
{"error"=>{"errors"=>[{"domain"=>"global", "reason"=>"invalidArgument", "message"=>"Recipient address required"}], "code"=>400, "message"=>"Recipient address required"}}
以下是用于生成请求的代码:
raw = Base64.urlsafe_encode64 message_string
result1 = api_client.execute!(
:api_method => gmail_api.users.messages.to_h['gmail.users.messages.send'],
:parameters => {
:uploadType => 'resumable',
:userId => 'me'
},
:headers => {
'Content-Type' => 'application/json',
'X-Upload-Content-Type' => 'message/rfc822',
'X-Upload-Content-Length' => raw.bytesize.to_s
}
)
upload_id = result1.headers['x-guploader-uploadid']
result2 = api_client.execute!(
:api_method => gmail_api.users.messages.to_h['upload.gmail.users.messages.send'],
:body_object => {
:raw => raw
},
:parameters => {
:uploadType => 'resumable',
:upload_id => upload_id,
:userId => 'me'
},
:headers => {
'Content-Type' => message.content_type,
'Content-Length' => raw.bytesize.to_s
}
)
答案 0 :(得分:1)
因此,问题(感谢@tholle)是,当发送大于5mb且小于35mb的附件时(也适用于不带附件的邮件),您不对请求的主体进行base64编码,而将multipart用作uploadType。不幸的是,文档根本没有提到这一点,并且错误消息也没有表明这一点。
这是一个工作示例,能够发送20mb的附件。希望这可以帮助其他浪费了无数小时来解决这个问题的人!
result = api_client.execute!(
:api_method => gmail_api.users.messages.to_h['gmail.users.messages.send'],
:body => rfc822_message_string,
:parameters => {
:uploadType => 'multipart',
:userId => 'me'
},
:headers => {
'Content-Type' => 'message/rfc822',
}
)