Отправляйте большие вложения (> 5 МБ) с помощью клиента Gmail API Node.js - PullRequest
0 голосов
/ 11 апреля 2019

Когда я использую клиент Gmail API Node.js для отправки электронного письма с вложением размером более 5 МБ, я получаю сообщение об ошибке «413 Request Entity Too Large».

Сначала я создаю строку mimeMessage, которая содержитсообщение MIME типа multipart / mixed.Одна часть этого сообщения представляет собой вложение, закодированное в base64, размером> 5 МБ.Затем я пытаюсь отправить его:

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 на resumable:

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

Я вижу из ответа сервера, чтоон оказался в строке запроса, но не решил проблему.

Я нашел примеры в PHP ( Отправка большого вложения с помощью Gmail API , Как отправлять большие вложения с помощьюAPI gmail ), Java (https://developers.google.com/api-client-library/java/google-api-java-client/media-upload) и Python ( Ошибка 10053 при отправке больших вложений с использованием API Gmail ). Но они используют «Google_Http_MediaFileUpload», «MediaHttpUploa»der 'и' MediaIoBaseUpload 'соответственно, и я не знаю, как применить это к nodejs-клиенту.

Я нашел пример в Python ( Использование Gmail API для отправки вложений размером более 10 МБ ), который использует uploadType = 'multipart' и сообщение, не закодированное в base64.Но я всегда получаю сообщение об ошибке, когда я не кодирую сообщение base64.

1 Ответ

0 голосов
/ 14 апреля 2019

В случае, если кто-то еще сталкивается с этой проблемой: не используйте свойство 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) => {
  ...
});
...