2

我想在收到的 Gmail 邮件中获取插入的图片(不是图片附件)。这是如何使用 Google Apps 脚本完成的?

我曾尝试使用urlfetchapp从图片链接地址获取图片数据:

https//mail.google.com/mail/u/0/?ui=2&ik=c348ccba97&view=att&th=13bb892c352c45dc&attid=0.2&disp=emb&realattid=ii_13bb88f3e56aae8c&zw&atsh=1

在电子邮件html正文中,但无法绕过google登录页面。响应内容数据始终是登录页面。

4

3 回答 3

3

编辑:虽然下面的代码适用于电子邮件草稿和预设回复,但它不允许您访问收到的电子邮件中的内联图像。

此代码片段来自我拥有的一个工作邮件合并,它支持内联图像(嵌入的 blob 和外部引用)和附件。它从草稿/预设回复中获取内联图像和附件,将它们添加到新电子邮件中并发送:

...
//selectedTemplate is a Gmail Message (draft/canned response) 
var emailTemplate = selectedTemplate.getBody(); 
var attachments = selectedTemplate.getAttachments();

if(emailTemplate.search(/<\img/ != -1)){  
    var inlineImages = {};
    var imgVars = emailTemplate.match(/<img[^>]+>/g);
    for(i in imgVars){
      var title = imgVars[i].match(/title="([^\"]+\")/);
      if (title) {
        title = title[1].substr(0, title[1].length-1);
        var titleEncoded = title.replace(/ /g,"-");
        for(j in attachments){
          if(attachments[j].getName() == title){
            inlineImages[titleEncoded] = attachments[j].copyBlob().setName(titleEncoded);
            attachments.splice(j,1);
          }
        }
        var newImg = imgVars[i].replace(/src="[^\"]+\"/,"src=\"cid:"+titleEncoded+"\"");
        emailTemplate = emailTemplate.replace(imgVars[i],newImg);
      }
    }
  }
...
GmailApp.sendEmail("test@example.com", "my subject", "my body",
                  {attachments: attachments,
                   inlineImages: inlineImages});

希望这可以帮助。

于 2013-01-07T05:25:56.583 回答
0

我不知道您是如何访问您的电子邮件的,但您似乎没有使用 Gmail 服务中的GmailApp。找到您感兴趣的电子邮件后,请检查 html 正文以找到<img>. 要么src是引用附件的 url(链接图像)或 cid(嵌入图像)。

于 2013-01-06T09:03:36.707 回答
0

解决此问题的最新方法。

问题

例如,这是使用 .getBody() 检索到的电子邮件正文

<div dir="ltr"><div><img src="?view=att&amp;th=1401f70d4881e07f&amp;attid=0.3&amp;disp=emb&amp;realattid=ii_1401f6fc7824ebe1&amp;zw&amp;atsh=1" alt="Inline image 4" width="200" height="180"><br></div><div><br></div><img src="?view=att&amp;th=1401f70d4881e07f&amp;attid=0.2&amp;disp=emb&amp;realattid=ii_1401f6e6c1d46c4b&amp;zw&amp;atsh=1" alt="Inline image 2" width="200" height="65"><div><br></div><div>
jtykuykyu</div><div><br></div><div><img src="?view=att&amp;th=1401f70d4881e07f&amp;attid=0.1&amp;disp=emb&amp;realattid=ii_1401f6e9df3a4b1c&amp;zw&amp;atsh=1" alt="Inline image 3" width="200" height="82"><br><div><br></div><div><br></div></div></div>

这是电子邮件的附件列表(其中是我们的内联图像):

[13-07-30 08:28:08:378 CEST] 屏幕截图 2013-07-12 下午 1.54.31.png

[13-07-30 08:28:08:379 CEST] 屏幕截图 2013-07-23 下午 5.38.51.png

[13-07-30 08:28:08:380 CEST] 屏幕截图 2013-07-25 上午 9.05.15.png

[13-07-30 08:28:08:381 CEST] test2.png

如您所见,这些图像的名称与 img 标签中可用的信息之间没有任何联系,因此没有安全的方法可以仅使用这些信息来重建正确的电子邮件。

解决方案

如何解决?我们可以使用 .getRawContent() 方法来获取实际的电子邮件并对其进行解析以获取我们需要的信息。具体来说,此方法为我们提供了附件名称和电子邮件正文中可用的“realattid”之间的关系:

内容类型:图片/png;name="2013-07-25 上午 9.05.15 截屏.png"

内容传输编码:base64

内容 ID:

X 附件 ID:ii_1401f6e9df3a4b1c

代码片段

这是一个代码片段:

- 检索电子邮件的正文和附件

- 获取正文中的所有 img 标签,并查看哪些标签链接到电子邮件中的附件

- 获取每个图像的“realattid”并使用 .getRawContent() 将此“realattid”链接到正确的附件

- 替换 img 标签以正确链接到正确的附件

- 表示这个附件不再是简单的附件而是内嵌图片

- 完成所有操作后,您就拥有了发送此电子邮件副本所需的所有数据,并显示正确的内嵌图像。

 //////////////////////////////////////////////////////////////////////////////
  // Get inline images and make sure they stay as inline images
  //////////////////////////////////////////////////////////////////////////////
  var emailTemplate = selectedTemplate.getBody();
  var rawContent = selectedTemplate.getRawContent();
  var attachments = selectedTemplate.getAttachments();

  var regMessageId = new RegExp(selectedTemplate.getId(), "g");
  if (emailTemplate.match(regMessageId) != null) {
    var inlineImages = {};
    var nbrOfImg = emailTemplate.match(regMessageId).length;
    var imgVars = emailTemplate.match(/<img[^>]+>/g);
    var imgToReplace = [];
    if(imgVars != null){
      for (var i = 0; i < imgVars.length; i++) {
        if (imgVars[i].search(regMessageId) != -1) {
          var id = imgVars[i].match(/realattid=([^&]+)&/);
          if (id != null) {
            var temp = rawContent.split(id[1])[1];
            temp = temp.substr(temp.lastIndexOf('Content-Type'));
            var imgTitle = temp.match(/name="([^"]+)"/);
            if (imgTitle != null) imgToReplace.push([imgTitle[1], imgVars[i], id[1]]);
          }
        }
      }
    }
    for (var i = 0; i < imgToReplace.length; i++) {
      for (var j = 0; j < attachments.length; j++) {
        if(attachments[j].getName() == imgToReplace[i][0]) {
          inlineImages[imgToReplace[i][2]] = attachments[j].copyBlob();
          attachments.splice(j, 1);
          var newImg = imgToReplace[i][1].replace(/src="[^\"]+\"/, "src=\"cid:" + imgToReplace[i][2] + "\"");
          emailTemplate = emailTemplate.replace(imgToReplace[i][1], newImg);
        }
      }
    }
  }
  //////////////////////////////////////////////////////////////////////////////
  var message = {
    htmlBody: emailTemplate,
    subject: selectedTemplate.getSubject(),
    attachments: attachments,
    inlineImages: inlineImages
  }
于 2018-04-03T02:55:24.903 回答