node.js Gmail API:获取embedded式/embedded式图像

抓取电子邮件时,运行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或其他任何方式来检索数据,而是使用唯一的CIDembedded。

所以我需要做的是,当从上面的函数中检索有效载荷时, 我还需要检索embedded的图像并将其保存在本地(如<\ CID.png> (或者JPG或其他))。 然后,我可以更换消息来replaceHTML中embedded的CID与图像的本地path。

那么有没有人知道如何获得这些embedded式图像有什么build议? 提前致谢!

图像将被提取到附件中。 在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