javascript - node.js Gmail API : Getting Inline/Embedded images

标签 javascript node.js gmail gmail-api

抓取电子邮件时,我运行 gmail.users.messages.get(),然后运行以下两个函数来处理有效负载

function getBody(message) {
  var encodedBody = '';  
  try{    
    if(typeof message.parts === 'undefined'){
      encodedBody = message.body.data;
    }    
    else{
      encodedBody = getHTMLPart(message.parts);
    }
    encodedBody = encodedBody.replace(/-/g, '+').replace(/_/g, '/').replace(/\s/g, '');
  }
  catch(e) {} // there was a failure

  return decodeURIComponent(escape(window.atob(encodedBody)));
}
function getHTMLPart(arr) {

  for(var x = 0; x <= arr.length; x++){    
    if(typeof arr[x].parts === 'undefined'){
      if(arr[x].mimeType === 'text/html'){
        return arr[x].body.data;
      }
    }
    else{      
      return getHTMLPart(arr[x].parts);
    }
  }
  return '';
}

然后,我将该数据保存到 .html 文件中以供以后使用。问题在于内联图像不是使用 base64 或任何其他方式来检索该数据嵌入的,而是使用唯一的 CID 嵌入的。

所以我需要做的是,当从上述函数检索有效负载时,我还需要检索嵌入的图像并将其本地保存为 <\CID.png> (或 jpg 或其他)。然后我可以对消息进行替换,将 html 中嵌入的 CID 替换为图像的本地路径。

那么有谁知道如何获取这些嵌入图像或有什么建议吗?提前致谢!

最佳答案

图像将被提取到附件中。在响应中查找 Content-IDX-Attachment-Id header 中包含 cid 的部分,获取附件,然后插入 base64 数据作为图像源而不是 cid

示例

var response = {
 "id": "15ade50437b9aa01",
 "threadId": "15ade50437b9aa01",
 "labelIds": [
  "UNREAD",
  "IMPORTANT",
  "SENT",
  "INBOX"
 ],
 "snippet": "",
 "historyId": "1171380",
 "internalDate": "1489788486000",
 "payload": {
  "mimeType": "multipart/related",
  "filename": "",
  "headers": [
   {
    "name": "Content-Type",
    "value": "multipart/related; boundary=94eb2c034184892a95054af46913"
   }
  ],
  "body": {
   "size": 0
  },
  "parts": [
   {
    "mimeType": "multipart/alternative",
    "filename": "",
    "headers": [
     {
      "name": "Content-Type",
      "value": "multipart/alternative; boundary=94eb2c034184892a93054af46912"
     }
    ],
    "body": {
     "size": 0
    },
    "parts": [
     {
      "partId": "0.0",
      "mimeType": "text/plain",
      "filename": "",
      "headers": [
       {
        "name": "Content-Type",
        "value": "text/plain; charset=UTF-8"
       }
      ],
      "body": {
       "size": 25,
       "data": "W2ltYWdlOiBJbmZvZ2FkIGJpbGQgMV0NCg=="
      }
     },
     {
      "partId": "0.1",
      "mimeType": "text/html",
      "filename": "",
      "headers": [
       {
        "name": "Content-Type",
        "value": "text/html; charset=UTF-8"
       }
      ],
      "body": {
       "size": 106,
       "data": "PGRpdiBkaXI9Imx0ciI-PGltZyBzcmM9ImNpZDppaV8xNWFkZTUwMmVlYTg0MGNlIiBhbHQ9IkluZm9nYWQgYmlsZCAxIiB3aWR0aD0iNTgiIGhlaWdodD0iNTQiPjxicj48L2Rpdj4NCg=="
      }
     }
    ]
   },
   {
    "partId": "1",
    "mimeType": "image/png",
    "filename": "smile.png",
    "headers": [
     {
      "name": "Content-Type",
      "value": "image/png; name=\"smile.png\""
     },
     {
      "name": "Content-Disposition",
      "value": "inline; filename=\"smile.png\""
     },
     {
      "name": "Content-Transfer-Encoding",
      "value": "base64"
     },
     {
      "name": "Content-ID",
      "value": "\u003cii_15ade502eea840ce\u003e"
     },
     {
      "name": "X-Attachment-Id",
      "value": "ii_15ade502eea840ce"
     }
    ],
    "body": {
     "attachmentId": "ANGjdJ8Xh1_0DBjFbc2qKRHD8uTw-9nkPP30v-vohJforDg54EHPHf3Obd2P9W6Wfss0cwfmblQWi5F3958vcEi0HyiMNgpKJbsQAVP9viUOY4LzyxwAvR7-dis4PNGflBpkZFMHv62LGKkQ1-ZPG3Go_Xh_sXJUveHl4JjmwLpNp6LjlHzuA_3XOkY2LLQLFmXNTo_dJbqDQWvMb8UTGnATMOoTNKvNQ4Ndr9pgQYI1SBvtdThgUDmlOGKYLHM6qR4AlrNNFnPUCZZU-BB7o7Dt2dhj-kexiIdvaB2LEnoeCBth_oK9HELt2tw4rlY",
     "size": 8539
    }
   }
  ]
 },
 "sizeEstimate": 12800
};

function getHtml(res) {
  var parts = [res.payload];
  while (parts.length) {
    var part = parts.shift();
    if (part.parts) {
      parts = parts.concat(part.parts);
    }

    if(part.mimeType === 'text/html') {
      return decodeURIComponent(escape(atob(part.body.data.replace(/\-/g, '+').replace(/\_/g, '/'))));
    }
  }
  return '';
}

function getAttachmentId(res, cid) {
  var parts = [res.payload];
  while (parts.length) {
    var part = parts.shift();
    if (part.parts) {
      parts = parts.concat(part.parts);
    }
    var headers = part.headers;
    var indexedHeaders = headers.reduce(function(acc, header) {
      acc[header.name.toLowerCase()] = header.value;
      return acc;
    }, {});
    var contentId = indexedHeaders['content-id'] || '';
    var xAttachmentId = indexedHeaders['x-attachment-id'] || '';
    if (contentId.includes(cid) || xAttachmentId.includes(cid)) {
      return part.body.attachmentId;
    }
  }
  return '';
}

var html = getHtml(response);
console.log(html);
// Extract the cids and find the matching attachments in the response
var attachmentId = getAttachmentId(response, 'ii_15ade502eea840ce');
console.log(attachmentId);
// Get the attachment from the Gmail API and replace the cid 
// with the base64-data

关于javascript - node.js Gmail API : Getting Inline/Embedded images,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42864666/

相关文章:

javascript - 如何模拟时区?

node.js - npm 不支持 Node.js v13.14.0

javascript - Showdown Markdown 不替换字符串

html - 使用 Angularjs 和 Nodejs 将 HTML 表单另存为 JSON 文件

python - 无法在python中登录gmail smtp服务器

google-apps-script - 如何使用谷歌应用程序脚本发送电子邮件草稿

javascript - 如何使用mean.js上传图像并将其保存到数据库(mongoose)

javascript - 使用 Selenium 或 HTMLUNIT 的 HttpClient?

javascript - 它不适用于 JQuery 的 attr () "onclick"

javascript - 使用 AppScript 回复 Gmail 中更改收件人的电子邮件最终进入新线程