1

使用: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 字符检索语言?

屏幕截图: 在此处输入图像描述

TIA。

4

1 回答 1

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;
于 2013-05-05T02:45:24.820 回答