使用Gmail API发送大于10mb的附件

时间:2018-08-06 19:47:06

标签: ruby http gmail-api

我正在努力寻找一个很好的例子,说明通过Gmail API发送包含大于10mb附件的电子邮件所必需的全部请求。

我见过https://developers.google.com/gmail/api/v1/reference/users/messages/sendhttps://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
  }
)

1 个答案:

答案 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',
    }
  )