node.js - 使用 Gmail API Node.js 客户端发送大型附件 (> 5 MB)
问题描述
当我使用 Gmail API Node.js 客户端发送附件大于 5 MB 的电子邮件时,我收到错误“413 Request Entity Too Large”。
我首先创建一个字符串 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 Request Entity Too Large”。
根据 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(使用 Gmail API发送大附件,如何使用 gmail API 发送大附件)、Java(https://developers.google.com/api-client-library/java/google-api-java-client )中找到了示例/media-upload)和 Python (使用 Gmail API 发送大型附件时出现错误 10053)。但他们分别使用“Google_Http_MediaFileUpload”、“MediaHttpUploader”和“MediaIoBaseUpload”,我不知道如何将其应用于nodejs-client。
我在 Python 中找到了一个示例(使用 Gmail API 发送大于 10mb 的附件),它使用了 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) => {
...
});
推荐阅读
- java - 如何接受用户输入并将其放入 while 条件
- ios - tableview swift中的行为空
- http - 如何在 Go 中自定义 http.Client 或 http.Transport 以在超时后重试?
- python - 使用 QuantLib 的加拿大债券的现金流出现错误
- ios - 核心数据 - FetchedResults
- 没有成员“删除”
- mysql - 左连接不产生空值
- python - 在 Heroku 上部署项目后出现内部服务器错误
- javascript - 未捕获(承诺中)DOMException:加载失败,因为找不到支持的源
- r - ggplot2:图例中的颜色“超出范围”
- r - 如何使用 Rstudio 连接到 Google Cloud PostGress 数据库?