Imap4客户端命令LSUB

时间:2015-06-29 10:51:33

标签: delphi email imap indy10

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内输入数据并获取我的电子邮件服务器文件夹,还是有另一种方法可以解决我的问题?

1 个答案:

答案 0 :(得分:2)

  

我的函数TIdIMAP4.ListSubscribedMailBoxes(AMailBoxList: TStrings): Boolean;存在问题:

当我使用最新的NVN版本的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参数中的文件夹名称。如果那不适合你,那么

  1. 您正在使用Indy的旧版/错误版。

  2. 您的服务器正在以TIdIMAP4无法解析的格式发送数据。

  3. 如果不知道您实际使用的是哪个版本的Indy,或者服务器的回复数据实际上是什么样子,则无法以某种方式诊断您的问题。