【问题标题】:node.js Gmail API: Getting Inline/Embedded imagesnode.js Gmail API:获取内联/嵌入式图像
【发布时间】:2017-08-09 10:23:24
【问题描述】:

在获取电子邮件时,我运行gmail.users.messages.get(),然后运行以下两个函数来处理payload

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 嵌入。

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

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

【问题讨论】:

    标签: javascript node.js gmail gmail-api


    【解决方案1】:

    图像将被提取到附件中。在响应中查找包含Content-IDX-Attachment-Id 标头中的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

    【讨论】:

    • 谢谢!我已经成功提取了邮件附件,但不知道内联也存储为附件,也不知道如何将cid 与文件名匹配。这个答案非常有帮助,谢谢!
    • @Harmonic 太棒了!乐于助人。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多