我对此实现的function TIdIMAP4.ListSubscribedMailBoxes(AMailBoxList: TStrings): Boolean;有问题:

function TIdIMAP4.ListSubscribedMailBoxes(AMailBoxList: TStrings): Boolean;
begin
  {CC2: This is one of the few cases where the server can return only "OK     completed"
  meaning that the user has no subscribed mailboxes.}
    Result := False;
    CheckConnectionState([csAuthenticated, csSelected]);
    SendCmd(NewCmdCounter, IMAP4Commands[cmdLSub] + ' "" *',
      [IMAP4Commands[cmdList], IMAP4Commands[cmdLSub]]);   {Do not Localize}
    if LastCmdResult.Code = IMAP_OK then begin
      // ds - fixed bug # 506026
      ParseLSubResult(AMailBoxList, LastCmdResult.Text);
      Result := True;
    end;
end;


调试时,我看到LastCmdResult.Text字符串列表为空,但是LastCmdResult.FormattedReply字符串列表具有我的电子邮件服务器上的所有文件夹(收件箱,已发送,已删除邮件,...)。当我尝试使用LastCmdResult.FormattedReply计数或文本时,它立即丢失了数据并给出了LastCmdResult.FormattedReply.Count=0LastCmdResult.FormattedReply.Text=''。所以我想知道是否有一种方法可以在LastCmdResult.FormattedReply中输入数据并获取我的电子邮件服务器文件夹,或者还有另一种方法可以解决我的问题?

最佳答案

我对此实现的功能TIdIMAP4.ListSubscribedMailBoxes(AMailBoxList: TStrings): Boolean;有问题:


当我使用最新的SVN版本的Indy尝试时,对我来说效果很好。


调试时,我看到LastCmdResult.Text字符串列表为空,但是LastCmdResult.FormattedReply字符串列表具有我的电子邮件服务器上的所有文件夹(收件箱,已发送,已删除邮件,...)。


当我运行它时,情况恰恰相反。 LastCmdResult.Text包含预期的文本,并且LastCmdResult.FFormattedReply为空(请注意,我直接提到了FFormattedReply数据成员,请参见下文)。


当我尝试使用LastCmdResult.FormattedReply计数或文本时,它立即丢失了数据并给出了LastCmdResult.FormattedReply.Count=0LastCmdResult.FormattedReply.Text=''


那是设计使然。客户端可以使用FormattedReply属性来解析服务器回复,以便可以填充TIdReply的属性值,并可以由服务器使用TIdReply的属性值来生成新的回复。因此,您无法从客户端的FormattedReply属性读取。


所以我想知道是否有一种方法可以在LastCmdResult.FormattedReply中输入数据并获取我的电子邮件服务器文件夹,或者还有另一种方法可以解决我的问题?


ListSubscribedMailBoxes()的全部目的是在AMailBoxList参数中返回文件夹名称。如果那对您不起作用,那么


您使用的是Indy的旧版/越野车版本。
您的服务器正在以TIdIMAP4无法解析的格式发送数据。


如果不知道您实际使用的是Indy的哪个版本,或者服务器的回复数据的实际外观,就无法以一种或另一种方式诊断您的问题。

07-28 04:56