Встроенные изображения прерываются при внедрении из HTMLBody существующего черновика [GmailApp] [Сценарий приложений]

#google-apps-script

#google-apps-script

Вопрос:

Я работаю над сценарием слияния почты, который принимает черновик сообщения GmailApp , получает его htmlBody и вложения и использует их для отправки нового сообщения.

Он отлично работает с вложениями и даже со встроенными сообщениями, которые были вставлены с внешнего URL-адреса (включая изображения в подписи Gmail); однако он не может обрабатывать встроенные изображения, вставленные непосредственно в черновик сообщения с помощью панели «Вставить изображение» в Gmail: эти изображения прерываются.

Использование includeInlineImages опции getAttachments() только изменяет, прикреплено ли рассматриваемое встроенное изображение к электронному письму или нет, но независимо от этого оно прерывается в теле.

Выдержка из кода:

 var allAttachments = draft.getMessage().getAttachments()
var htmlBody = draft.getMessage().getBody()
GmailApp.sendEmail(recipient, subject, '', {
              name:senderName,
              from:senderEmail,
              htmlBody:htmlBody,
              cc:allCc,
              bcc:bcc,
              attachments: allAttachments
 

Любые предложения приветствуются.

Ответ №1:

Поврежденное изображение возникает, когда источник или отображение изображения определены неправильно.

Если вы печатаете htmlBody , каждое встроенное изображение имеет cid и cid используется для сопоставления изображения.

Пример: <div dir="ltr"><img data-surl="cid:xxsome_idxx" src="cid:xxsome_idxx" alt="dog.jpg" width="490" height="246"><br></div>

Чтобы устранить проблему, вы должны установить значения встроенных изображений в GmailApp.SendEmail, а значение cid в вашем html должно соответствовать ключу изображения во встроенных изображениях. См. Пример: ссылка

Я создал демонстрационную версию о том, как настроить отображение изображения из черновика в новое электронное письмо.

Пример черновика:

Черновое сообщение

Код:

 function getInlineImagefromDraft() {
  var draft = GmailApp.getDrafts()[0];
  var allAttachments = draft.getMessage().getAttachments();
  var htmlBody = draft.getMessage().getBody();
  
  var searchstring = "img data-surl="cid:";
  //search string position
  var index = htmlBody.search(searchstring);
  if (index >= 0) {
    ////the goal of this section is to get the value of cid
    var pos = index   searchstring.length
    var id = htmlBody.substring(pos, pos   15);
    //remove double quotes
    id = id.replace(/"/,"");
    //remove characters after space
    id = id.replace(/s.*/g, "");
    
    //send email
    var recipient = 'someemail';
    var subject = 'testing only gmail';
    var senderName = 'testing name';
    var senderEmail = 'someemail';
    GmailApp.sendEmail(recipient, subject, '', {
                name:senderName,
                from:senderEmail,
                htmlBody:htmlBody,
                inlineImages: {[id]: allAttachments[0]}
  });
  }  
}
 

Вывод:
Вывод

Ссылка:

Параметры предварительной отправки электронной почты

Комментарии:

1. Большое спасибо, Никко — это действительно полезно, как раз то, что мне было нужно!

Ответ №2:

И просто чтобы добавить к вышеупомянутому решению Никко Дж., вот код для получения всех встроенных изображений:

 //Get all attachments for inline images
var allInlineImages = draft.getMessage().getAttachments({includeInlineImages: true,includeAttachments:false})
var justAttachments = draft.getMessage().getAttachments({includeInlineImages: false})

//Initiate the allInlineImages object
var inlineImagesObj = {}
//Regexp to search for all string positions 
var regexp = RegExp('img data-surl="cid:', 'g');
var indices = htmlBody.matchAll(regexp)

//Iterate through all matches
var i = 0;
for (const match of indices){
  //Get the start position of the CID
  var thisPos = match.index   19
  //Get the CID
  var thisId = htmlBody.substring(thisPos, thisPos   15).replace(/"/,"").replace(/s.*/g, "")
  //Add to object
  inlineImagesObj[thisId] = allInlineImages[i]
  i  
}

GmailApp.sendEmail(recipient, subject, '', {
  name:senderName,
  from:senderEmail,
  htmlBody:htmlBody,
  cc:allCc,
  bcc:bcc,
  attachments: justAttachments,
  inlineImages: inlineImagesObj
})