Indy IMAPClient UIDRetrieveAllEnvelopes没有正确获取其他字符集

时间:2013-05-04 18:22:53

标签: delphi unicode indy utf

使用:Delphi XE2,Windows 8,美国英语为默认语言

我正在用Delphi写一个电子邮件客户端。我使用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。

1 个答案:

答案 0 :(得分: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;