【问题标题】:Imap4 client command LSUBImap4 客户端命令 LSUB
【发布时间】:2015-09-15 19:20:39
【问题描述】:

我对 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 中输入数据并获取我的电子邮件服务器文件夹,或者还有其他方法可以解决我的问题吗?

【问题讨论】:

    标签: delphi email imap indy10


    【解决方案1】:

    我对这个实现的函数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 参数中的文件夹名称。如果这不适合你,那么要么

    1. 您使用的是旧版/有缺陷的 Indy。

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

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

    【讨论】:

    • 我连接到 yahoo 的 imap 服务器(imap.mail.yahoo.com 在端口 993 上使用用户名和密码),这就是 FormattedReply 字符串列表的样子:[0]=* LSUB (\HasNoChildren ) "/" "群发邮件" [1]=* LSUB (\HasNoChildren) "/" "草稿" [2]=* LSUB (\HasNoChildren) "/" "收件箱" [3]=* LSUB (\HasNoChildren) "/" "Sent" [4]=* LSUB (\HasNoChildren) "/" "Trash" [5]=C3 OK LSUB Completed 我使用的indy版本是10.6.2.5263
    • 我刚刚将我的 Indy 从 https://indy.fulgan.com/ZIP/ - Indy10_5283.zip 升级到最新版本,但问题仍然存在。
    • 当我连接到 Gmail 的 IMAP 服务器时工作正常。我会用 Yahoo's 测试并报告。
    • 我使用 Yahoo 的 IMAP 和 GoDaddy 的 IMAP 进行了测试。 ListMailBoxes()ListSubscribedMailBoxes() 工作正常,AMailBoxList 参数在这两种情况下都收到了邮箱名称列表。那么你遇到的实际问题是什么?您的 AMailBoxList 对象根本没有被填充?或者它是,但不是你期望的方式?或者您只是在 Indy 的源代码中进行调试并且不了解它在内部是如何工作的?
    • 问题是 AMailBoxList 对象根本没有被填充,我也不完全理解 Indy 在内部做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2011-09-19
    • 2017-01-19
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多