2016-02-18 59 views
1

我對着在適當從可視化的GMail電子郵件中提取一些麻煩的適當的可視化問題。我使用GMail API來檢索消息。這部分似乎工作正常,我得到了整個消息的JSON。 這裏是身體部位德爾福XE5:用提取的GMail電子郵件

"mimeType": "multipart/alternative", 
"filename": "", 
"headers": [ 
{ 
    "name": "Content-Type", 
    "value": "multipart/alternative; boundary=001a114710d029267205278f13b9" 
} 
], 
"body": { 
"size": 0 
}, 
"parts": [ 
{ 
    { 
    "partId": "0.0", 
    "mimeType": "text/plain", 
    "filename": "", 
    "headers": [ 
    { 
    "name": "Content-Type", 
    "value": "text/plain; charset=UTF-8" 
    }, 
    { 
    "name": "Content-Transfer-Encoding", 
    "value": "quoted-printable" 
    } 
    ], 
    "body": { 
    "size": 549, 
    "data": "SGkgUGF1bCwNCg0KQXBvbG9naWVzLCBidXQgSSBmb3Jnb3QgdG8gbWVudGlvbiB0aGF0IHRoZSByZXN0IG9mIHlvdXIgb3JkZXIgaGFzIGJlZW4NCnNlbnQgb3V0IGluIHRoZSBtZWFudGltZQ0KDQpNYW55IHRoYW5rcw0KDQoqS2luZCBSZWdhcmRzKg0KKkJhcmJhcmEgSm9uZXMqDQoqSW50ZXJuZXQgU2FsZXMqDQoNCipPbGQgTWlsbCBTYWRkbGVyeSoNCg0KKnd3dy5zYWRkbGVyeS5iaXogPGh0dHA6Ly93d3cuc2FkZGxlcnkuYml6Lz4qDQoNCipUZWw6ICs0NCAoMCkyOCA5MzM1IDMyNjggPCUyQjQ0JTIwJTI4MCUyOTI4JTIwOTMzNSUyMDMyNjg-Kg0KDQoqVGFrZSBhIFZpcnR1YWwgdG91ciBvZiBvdXIgc2hvcCoNCkdvb2dsZSBwbGFjZXMgaHR0cDovL2dvby5nbC85Y1o5ZDANCipbaW1hZ2U6IElubGluZSBpbWFnZXMgNF1XaXNoaW5nIHlvdSBhIHZlcnnigItbaW1hZ2U6IElubGluZSBpbWFnZXMgM10qDQoqICAgICAgICAgICAgICAgICAgTWVycnkgQ2hyaXN0bWFzKg0KDQoq4oCLICAg4oCLICDigIsgICAgW2ltYWdlOiBJbmxpbmUgaW1hZ2VzIDJd4oCLKg0K" 
    } 
} 

那麼,什麼是數據部分與編碼的一個小部分?我對「Content-Transfer-Encoding」 - >「quoted-printable」感到困惑。我應該使用「quoted-printable」解碼器解碼數據的值嗎? 起初沒有注意到「引用可打印」的價值,我解碼使用DecodeBase64的數據值,這裏是怎麼了使它

function TViewEmailsForm.DecodeData(aStr: String): String; 
var 
    aStrm: TBytesStream; 
    aStrStrm: TStringStream; 
begin 
    Result := ''; 
    if aStr = '' then 
    Exit; 

    aStrm := TBytesStream.Create(DecodeBase64(aStr)); 

    aStrStrm := TStringStream.Create; 

    try 
    aStrm.Position := 0; 
    aStrStrm.LoadFromStream(aStrm); 
    Result := aStrStrm.DataString; 
    finally 
    aStrm.Free; 
    aStrStrm.Free; 
    end; 
end; 

使用返回人類可讀的文本,但在年底更多的東西被解碼和我不明白這是什麼。我認爲這是某種形式的粗體文本,鏈接,簽名類型,但我無法正確顯示它(不知道要使用什麼作爲組件 - RichEdit,HTMLViewer) 已解碼字符串的結尾像

....... 
*Name of the company* 

*website of the company <again the website of the company>* 

*Tel: +44 (0)28 9335 3268 <%2B44%20%280%2928%209335%203268 
ѓBѓBЉ•ZЩHHљ\ќX[Э\€Щ€Э\€ЪЬ 
ѓB‘ЫЫЩЫHXЩ\И‹ЛЩЫЫЛ™ЫОXЦЋYBЉ–Ъ[XYЩN€[›[™H[XYЩ\И 
UЪ\Ъ[™И[ЭHH™\ћx "ЦЪ[XYЩN€[›[™H[XYЩ\ИЧJѓBЉ€Y\њћHЪљ\ЭX\КѓBѓBЉё "И8 "И8 "ИЪ[XYЩN€[›[™H[XYЩ\И—x "КѓB› 

我有一些假裝有html正文,但同樣的數據是以這種方式看到的消息。我試圖加載這個字符串到TRichEdit的行,但沒有運氣,我試圖用TIdDecoderQuotedPrintable來解碼這個字符串,雖然我不知道我是否必須這樣做,但一些字符被替換爲'?'。 (問號) 我在這裏錯過了什麼以及消息內容可視化的正確方法是什麼?

+0

如果它是一個標誌,它很可能是一個畫面,例如一個公司的標誌。 –

+0

是的,那裏可能有類似的東西,但是如何確定它是什麼?我想這個問題的答案與這個問題有關http://stackoverflow.com/questions/5584204/changing-charset-when-retrieving-messages-from-mail-server,我甚至想到解析整個json並將其放入TIdMessage中,但接下來是如何將該郵件可視化? –

+0

FWIW,我沒有XE7的幫助下找到'DecodeBase64'所以我用'DecodeBytes64',而是和它沒有返回與編碼的電話號碼作爲在您的文章結尾的字符串(即....%203268)。 –

回答

1

認真的研究和測試不同的編碼器/解碼器,我終於成功地正確解碼什麼消息在編碼後。 我用Indy的TIdEncoderMIMEIdCoderMIME發現和使用的DecodeString方法。 HTML消息和主體也被正確解碼。 希望這可以幫助其他人不用花兩天的時間與解碼消息「拼搏」!

編輯:我注意到符號>來作爲?也許還有其他的事情要做?

EDIT2:看來這個數據的編碼是不實際的Base64但Base64Url。在下面的鏈接http://blog.marcocantu.com/blog/delphi_facebook_base64_encoding.html你可以找到有趣的文章。圖像以這種方式編碼,而標準解碼不能用於提取它們。 誰知道法國人可以讀的東西在這裏也http://codes-sources.commentcamarche.net/source/51156-base64-base64url-encode-decode

+0

謝謝你讓我們知道。內容是什麼? –

+0

事實上,只有[圖像插入] +一些文字纔會顯示圖像。最後,我使用pbear HTML查看器移植來顯示我從文本/ html正文部分獲取的數據,需要進行一些調整才能正確顯示圖像,但是我的解碼主要問題似乎已解決 –

+0

感謝您的編輯2 !很高興知道。 –