适用于sendMail中inlineImages的Google Script CacheService缓存图片

时间:2016-03-01 13:19:06

标签: google-apps-script sendmail

我想将图像存储在Google Script的Cacheservice中,然后将此图像作为内嵌图像插入HTML邮件中。

我试图让它发挥作用,但到目前为止还没有成功。 Logger中以下代码的错误是“无效参数:附件”。如果我检查它,则表明sendMail()中的var图标是一个blob:

function onOpen(e){
  var icon = DriveApp.getFileById('ID').getBlob().setName('icon');
  var cache = CacheService.getDocumentCache().put('icon', icon);
  }

function sendMail() {

  var icon = CacheService.getDocumentCache().get('icon');

  var email = 'test@example.de';
  var subject = 'test';
  var txt = 'test';
  var html = '<img src="cid:icon"/>';

   MailApp.sendEmail(email, subject, txt, {htmlBody: html, name : 'test', inlineImages:{icon:icon}});

}

令人惊讶的是,如果我这样做:

 function sendMail() {

      var icon = DriveApp.getFileById('ID').getBlob().setName('icon');

      var email = 'test@example.de';
      var subject = 'test';
      var txt = 'test';
      var html = '<img src="cid:icon"/>';

       MailApp.sendEmail(email, subject, txt, {htmlBody: html, name : 'test', inlineImages:{icon:icon}});

    }

它工作正常。我的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

Google Cache Service accepts 字符串 值,而您尝试将blob推入其中,这显然是不同的类型。一旦你把它变成一个合适的字符串 - 它就没事了。

为了确保我们正确保存它,我们应该使用base64encode。

尝试替换

var cache = CacheService.getDocumentCache().put('icon', icon);

var cache = CacheService.getDocumentCache()
cache.put('icon', Utilities.base64Encode(icon.getBytes()));

分别当你获得缓存值时,你需要从我们的字符串中创建一个新的blob对象。

首先我们创建空blob并读取缓存值:

var iconBlob = Utilities.newBlob("")
var cachedValue = cache.get('icon');

然后您就可以使用它:

iconBlob.setBytes(Utilities.base64Decode(cachedValue ))
iconBlob.setName('yourname')
iconBlob.setContentType('image/png')

您可以在reference中查看这两种方法。 如果对字符串进行字符串化,也可以使用相同的方式在缓存服务中保存对象。