抓取电子邮件时,我运行 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-ID
或 X-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/