#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
})