2013-05-04 40 views
1

使用:德爾福XE2,Windows 8的美國英語作爲默認語言印IMAPClient UIDRetrieveAllEnvelopes沒有得到其他字符集正確

我寫的電子郵件客戶端與德爾福。我使用TIdIMAP4通過IMAP連接到Gmail郵箱,並得到這樣的消息列表:

var 
    MessageList: TIdMessageCollection; 
    begin 
    IMAPClnt.SelectMailBox('INBOX'); 
    IMAPClnt.UIDRetrieveAllEnvelopes(IMAPClnt.MessageList); 

然後我檢索郵件主題是這樣的:

var 
    IdMsg: TIdMessage; 
    s: String 
    begin 
    for c := 0 to FIMAPClnt.MessageList.Count - 1 do 
    begin 
    IdMsg := FIMAPClnt.MessageList[c]; 
    s := IdMsg.Subject; 

但是,如果消息主題使用不同的語言(如希伯來語),則即使在希伯來語設置爲默認Windows語言的計算機上,消息主題也不能正確顯示(請參閱附加圖像)。

如何更正代碼以確保其正常工作,以正確的Unicode字符檢索語言?

截屏: enter image description here

TIA。

回答

2

根據RFC 2047(「MIME第三部分:非ASCII文本的消息頭擴展」),屏幕截圖中的電子郵件標頭已經編碼。 TIdIMAP4.UIDRetrieveAllEnvelopes()捕獲並存儲原始數據,不會自動對其解碼。您可以使用各種Decode...()功能在IdCoderHeaader.pas單位頭手動解碼,如:

uses 
    ..., IdCoderHeader; 

var 
    IdMsg: TIdMessage; 
    s: String 
begin 
    ... 
    for c := 0 to FIMAPClnt.MessageList.Count - 1 do 
    begin 
    IdMsg := FIMAPClnt.MessageList[c]; 
    IdMsg.Subject := DecodeHeader(IdMsg.Subject); 
    DecodeAddresses(IdMsg.FromList); 
    DecodeAddress(IdMsg.Sender); 
    DecodeAddresses(IdMsg.ReplyTo); 
    DecodeAddresses(IdMsg.Recipients); 
    DecodeAddresses(IdMsg.CCList); 
    DecodeAddresses(IdMsg.BccList); 
    ... 
    end; 
    ... 
end; 
+0

僅供參考,當我去實現這一點,我發現DecodeAddresses需要兩個參數(這是可能的,這是在API中的變化)因此,我最終更改了DecodeAddresses行,如下所示:'DecodeAddresses(IdMsg.FromList.EMailAddresses,IdMsg.FromList);' – 2016-06-29 19:56:51

+0

我不會建議這種方法。從「EmailAddresses」屬性中讀取時,實際上是生成一個新的字符串值,該值可能與原始值不同。由於'TIdIMAP'已經解析了原始字符串並將其分解爲'FromList',所以最好簡單地遍歷'FromList'項並根據需要單獨解碼它們。 – 2016-06-29 20:15:42

+0

回顧Indy的歷史,從來沒有一個「DecodeAddresses()」的單參數版本,它一直是一個雙參數函數。我不記得我從哪裏得到1參數版本。 – 2016-06-29 20:18:14