Как отправить сообщение Gmail, используя Advanced Gmail Service в GAS? - PullRequest
0 голосов
/ 24 июня 2018

Моя цель состоит в том, чтобы получить существующее входящее сообщение с помощью расширенной службы Gmail в GAS, изменить строку темы и затем вызвать Gmail.Users.Messages.insert (), чтобы вставить новое сообщение в папку «Входящие». Я знаю, что могу достичь этого результата, загружая в конечные точки API Gmail, но я пытаюсь понять, как работает расширенная служба, и сделать код менее подробным.

Согласно документации, метод "insert ()" принимает ресурс сообщения в качестве закодированной строки. Формат следующий

Gmail.Users.Messages.insert({"raw":Utilities.base64EncodeWebSafe(message)}, "me");

Параметр 'message', который передается в функцию кодирования, должен быть байтовым массивом, представляющим содержимое сообщения. Я могу получить байты для существующего входящего сообщения, проверив его «сырое» свойство.

var message = Gmail.Users.Messages.get("me", messageId, {format:"raw"});
var bytes = message.raw;

Проблема в том, что когда вы передаете {format: "raw"} в качестве необязательного параметра методу get (), вы больше не можете проверять свойства сообщения и получать доступ к свойству payload. Если вы передаете {format: "full"} вместо этого, полезная нагрузка есть, но не свойство "raw".

Вы можете создать новое сообщение с помощью Gmail.newMessage () и установить свойства вручную, но я понятия не имею, как использовать его с методами "insert ()" и "get ()". Тип возврата для метода «newMessage ()» - «Сообщение», но в расширенной службе Gmail, похоже, нет ни одного метода, который мог бы принимать параметры этого типа. Мне все еще нужно получить байты для сообщения и закодировать их. Однако

var message = Gmail.newMessage();
(Logger.log(message.raw));  // logs  undefined

Может быть, я что-то упускаю, но это похоже на огромный улов-22. Я не понимаю, почему метод Gmail.newMessage () построителя сообщений даже существует, если его нелегко использовать с другими методами, которые должны быть обертками вокруг Gmail API.

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Мне удалось найти быстрый и грязный ярлык с помощью Regex.Выражаем недовольство решением Диму, так как оно, вероятно, намного лучше в долгосрочной перспективе, но мне нужно сделать более глубокое погружение.

var message = GmailApp.getMessageById(messageId);
var rawContent = message.getRawContent();
// Regex logic for matching the subject line
rawContent = rawContent.replace(oldSubjectLine, newSubjectLine);
var encodedMsg = Utilities.base64EncodeWebSafe(rawContent);

var message = Gmail.newMessage();
message.raw = encodedMsg;

Gmail.Users.Messages.insert(message, "me");
0 голосов
/ 04 июня 2019

Просто для того, чтобы опираться на то, что было создано между комментаторами здесь, я поделюсь кодом, который я создал, чтобы успешно получить черновик по его идентификатору, изменить получателя и отправить сообщение с помощью Advanced Gmail Service вГАЗ.Это решение заняло у меня (буквально) несколько дней.

function sendFromDraft (id, recipient) {
  // get the draft by ID and its raw content
  var message = GmailApp.getMessageById(id);
  var rawContent = message.getRawContent();
  
  // determines if recipient is already defined in draft, routes accordingly, updates with new recipient
  var addRecipient = 'To: <' + recipient + '>';
  var recipientFromTemplate = rawContent.match(/To:.[^>]+>/);
  if (recipientFromTemplate === null) {
    var fromField = rawContent.match(/From:.[^>]+>/);
    var updateWithRecipient = fromField + '\n' + addRecipient;
    rawContent = rawContent.replace(fromField, updateWithRecipient);    
  } else {
    rawContent = rawContent.replace(recipientFromTemplate, addRecipient);
  }
  
  var message = Gmail.newMessage();
  var encodedMsg = Utilities.base64EncodeWebSafe(rawContent);

  message.raw = encodedMsg;
  
  Gmail.Users.Messages.send(message, "me", Utilities.newBlob(rawContent, "message/rfc822"));
};

Я должен выкрикнуть Romain Vialard и вышеприведенные комментарии для добавления важной информации, которая позволила мне разработать рабочий код.Я надеюсь, что это поможет другим разработчикам в будущем.

0 голосов
/ 24 июня 2018

Методы с префиксом new в расширенной службе служат для генерации пустых ресурсов объектов.Они существуют исключительно с целью завершения кода в редакторе скриптов приложений.Чтобы использовать их эффективно, вы должны установить требуемые свойства для объектов, созданных этими методами, а затем передать их методам, которые требуют этот ресурс.

Итак, в вашем случае вы бы создали сообщение следующим образом:

var messageResource = Gmail.newMessage();

messageResource.raw = Utilities.base64EncodeWebSafe([messageData]);

Затем вы передадите его методу вставки:

Gmail.Users.Messages.insert(messageResource, "me");

Они могуткажутся излишними, но некоторые могут найти ценным завершение кода на этих объектах ресурса.

Лично я склонен избегать их использования и просто передавать объекты по мере необходимости (как вы это делали в своем первоначальном примере).Как только вы узнаете необходимые свойства этих объектов ресурсов, вы можете отбросить эти «обучающие колеса» и просто использовать вместо них встроенные объекты.

Что касается этой проблемы:

Проблема в том, что когда вы передаете {format: "raw"} в качестве необязательного параметра методу get (), вы не можетедольше изучите свойства сообщения и получите доступ к свойству «полезной нагрузки».Если вместо этого вы передаете {format: "full"}, полезная нагрузка есть, но нет свойства "raw".

Это либо ситуация, либо ситуация с методом Gmail.Users.Messages.get().Если вы посмотрите на документацию , вы увидите, что вам нужно установить параметр формата, и, следовательно, вы не можете получить всю необходимую информацию за один вызов.Однако все, что вам нужно сделать, это сделать два звонка;один, где формат установлен на «полный» и другой, где формат установлен на «raw» , и тогда у вас будет то, что вам нужно.Код может быть не самым элегантным, но он достигнет ваших целей.


Для решения проблемы, указанной в вашем комментарии;Я подозреваю, что вам, возможно, придется использовать медиафайлы .Метод вставки имеет несколько подписей, как показано на снимке экрана ниже: enter image description here Возможно, вам потребуется использовать 2-й или 3-й вариант для загрузки данных сообщения.Отредактируйте объект полезной нагрузки, измените строку темы и передайте ее в свой ресурс сообщения, а затем преобразуйте необработанные данные в BLOB-объект Utilities.newBlob([raw Byte[]]) (вам нужно преобразовать необработанную строку в кодировке base64 в байтовый массив, прежде чем преобразовать ее вBlob object) и передайте его в качестве 3-го параметра.Не уверен, что это сработает, но стоит попробовать.

...