使用Gmail API Node.js客户端发送大型附件(> 5 MB)

时间:2019-04-11 19:07:33

标签: node.js gmail-api google-api-nodejs-client

当我使用Gmail API Node.js客户端发送附件大于5 MB的电子邮件时,出现错误“ 413请求实体太大”。

我首先创建一个字符串mimeMessage,其中包含类型为multipart / mixed的MIME消息。此消息的一部分是大小大于5 MB的base64编码附件。然后我尝试发送它:

gmail = google.gmail({ version: 'v1', auth: authentication });

encodedMimeMessage = Buffer.from(mimeMessage)
  .toString('base64')
  .replace(/\+/g, '-')
  .replace(/\//g, '_')
  .replace(/=+$/, '');

gmail.users.messages.send({
  userId: 'me',
  resource: { raw: encodedMimeMessage }
}, (err, res) => {
  ...
});

这将导致错误响应“ 413请求实体太大”。

根据api文档,应使用可恢复的上传(https://developers.google.com/gmail/api/guides/uploads#resumable)。但是文档仅提供HTTP请求的示例,而没有描述如何使用Node.js客户端完成请求。我想避免将对google-api-nodejs-client的调用与HTTP请求混在一起。如果无法避免,那么我将非常感谢一个很好的示例,说明如何在Node.js中执行此操作。

我尝试将uploadType设置为可恢复:

gmailApi.users.messages.send({
  userId: 'me',
  uploadType: 'resumable',
  resource: { raw: encodedMimeMessage }
}, (err, res) => {
  ...
});

我从服务器响应中看到它最终出现在查询字符串中,但是并不能解决问题。

我在PHP(Send large attachment with Gmail APIHow to send big attachments with gmail API),Java(https://developers.google.com/api-client-library/java/google-api-java-client/media-upload)和Python(Error 10053 When Sending Large Attachments using Gmail API)中找到了示例。但是他们分别使用了“ Google_Http_MediaFileUpload”,“ MediaHttpUploader”和“ MediaIoBaseUpload”,我不知道如何将其应用于nodejs-client。

我在Python(Using Gmail API to Send Attachments Larger than 10mb)中找到了一个示例,该示例使用uploadType ='multipart'和未经过base64编码的消息。但是当我不对消息进行base64编码时,总是会收到错误响应。

1 个答案:

答案 0 :(得分:0)

如果其他人遇到此问题:发送电子邮件时,请不要使用第一个方法参数的resource.raw属性。而是使用media属性:

const request = {
  userId: 'me',
  resource: {},
  media: {mimeType: 'message/rfc822', body: mimeMessage}
};

gmailApi.users.messages.send(request, (err, res) => {
  ...
});

在这种情况下,mimeMessage不得使用base64进行编码。在resource中,您可以选择指定属性threadId

const request = {
  userId: 'me',
  resource: {threadId: '...'},
  media: {mimeType: 'message/rfc822', body: mimeMessage}
};

gmailApi.users.messages.send(request, (err, res) => {
  ...
});