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

Send large attachments (> 5 MB) with the Gmail API Node.js 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.

中提供一个很好的例子

我尝试将上传类型设置为可恢复:

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

我从服务器响应中看到它在查询字符串中结束,但并没有解决问题。

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

我在 Python () 中找到了一个使用 uploadType = 'multipart' 和未使用 base64 编码的消息的示例。但是当我不对消息进行 base64 编码时,我总是收到错误响应。

如果其他人遇到此问题:发送电子邮件时不要使用第一个方法参数的 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) => {
  ...
});