2017-03-17 25 views
1

メールを取得するときは、gmail.users.messages.get()を実行し、次の2つの機能を実行して​​を処理します。node.js Gmail API:インライン/埋め込み画像の取得

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を画像のローカルパスに置き換えることができます。

どのように知っていますか、それらの埋め込み画像を取得する方法に関するアドバイスをお持ちですか?前もって感謝します!

答えて

1

画像が添付ファイルに抽出されます。応答内でContent-IDまたはX-Attachment-Idヘッダーにcidが含まれている部分を探し、添付ファイルを取得してcidの代わりに画像ソースとしてbase64データを挿入します。

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

+1

ありがとう!私は既にメッセージの添付ファイルを正常に抽出しましたが、インラインが添付ファイルとして保存されていることを知らず、 'cid'とファイル名をどのようにマッチさせるか分かりませんでした。この回答はとても役に立ちました、ありがとう! – Harmonic

+0

@Harmonic素晴らしい!お力になれて、嬉しいです。 – Tholle

関連する問題