1

我正在寻找有关如何在 C++ Builder 中使用 Indy Imap 下载邮件附件的分步解决方案(我使用 C++ Builder XE8)。我在 Delphi 中阅读了一些教程,但真的很困惑。

比如选择邮箱后应该怎么做?

ImapClient->UIDRetrieve()

或者

ImapClient->RetrieveStructure()

或者

ImapClient->RetrievePart()

或者

ImapClient->RetrieveEnvelop().

那么,接下来我应该怎么做才能识别 MessagePart 没有,有附件文件?

最后一个,如何将该文件保存到本地驱动器?

我应该用 C++ 翻译以下内容吗?

TIdAttachmentFile(mbMsgP.MessageParts.Items[liCount]).SaveToFile(fName);

但我无法创建这样的声明

 TIdAttachmentFile(IdMessage1->MessageParts->items[no])->SaveToFile("filename");
4

1 回答 1

2

我在 Delphi 中阅读了一些教程,但真的很困惑。

这并不奇怪,因为 IMAP 通常是一个复杂且令人困惑的协议。这就是为什么与其他邮箱协议(如和)TIdIMAP4相比有更多方法的原因(它甚至没有实现 IMAP 的所有功能)。TIdPOP3TIdSMTP

比如选择邮箱后应该怎么做?

ImapClient->UIDRetrieve() 或 ImapClient->RetrieveStructure() 或 ImapClient->RetrievePart() od ImapClient->RetrieveEnvelop()。

这实际上取决于您打算如何处理电子邮件及其附件。

(UID)Retrieve()下载整封电子邮件,将其解析为 aTIdMessage并在服务器上将其标记为“已读”。

(UID)RetrieveStructure()检索电子邮件中各种 MiME 部分的父/子层次结构,为一个TIdMessage.MessagePartsTIdImapMessageParts集合中的每个部分创建一个条目,提供有关每个部分的一些基本描述信息,例如内容类型和部分编号。不检索每个部分的实际内容。

(UID)RetrievePart()检索电子邮件特定 MIME 部分的实际内容。您无需下载整个电子邮件。但是您必须先下载电子邮件的结构,以便知道要检索的部件号。

(UID)RetrieveEnvelope()检索电子邮件的一些基本顶级标题:日期、主题、发件人、回复、收件人、抄送、密件抄送、回复中和消息 ID。

那么,接下来我应该怎么做才能识别 MessagePart 没有,有附件文件?

如果您下载整封电子邮件,则必须遍历其MessageParts集合以查找TIdAttachment包含您感兴趣的所需文件名/内容类型的对象。

如果您只下载电子邮件的一部分,则必须检索电子邮件的结构并遍历生成的集合以查找包含您感兴趣的所需文件名/内容类型的条目,然后您可以请求该特定部分的内容。

最后一个,如何将该文件保存到本地驱动器?

如果您下载整封电子邮件,那么您将调用SaveToFile()所需的TIdAttachment对象:

static_cast<TIdAttachment*>(IdMessage1->MessageParts->Items[no])->SaveToFile("filename");

如果您下载电子邮件的结构,您可以使用(UID)RetrievePart()将附件的数据检索到TStream对象中,例如TFileStream.

于 2016-01-12T05:25:34.037 回答