在 C++ Builder 中使用 Indy IMAP4 下载电子邮件附件文件

Download email attachment files using Indy IMAP4 in C++ Builder

我正在寻找有关如何在 C++ Builder(我使用 C++ Builder XE8)中使用 Indy Imap 下载邮件附件的分步解决方案。我已经阅读了 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");

I have read some tutorial in Delphi, but really getting Confused.

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

For example, what should I do after selecting the mailbox?

ImapClient->UIDRetrieve() or ImapClient->RetrieveStructure() or ImapClient->RetrievePart() od ImapClient->RetrieveEnvelop().

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

(UID)Retrieve() 下载整封电子邮件,将其解析为 TIdMessage 并在服务器上将其标记为 "read"。

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

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

(UID)RetrieveEnvelope() 检索电子邮件的一些基本 top-level headers:日期、主题、发件人、发件人、reply-to、收件人、抄送、密件抄送、in-reply-to 和 message-id.

Then, what should I do next to identify the MessagePart no, haveing the attachment file?

如果您下载整封电子邮件,则必须遍历其 MessageParts collection 以查找包含所需 filename/contenttype 的 TIdAttachment object你感兴趣的。

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

The Last One, how to save that file to local drive?

如果您下载整封电子邮件,那么您将在所需的 TIdAttachment object:

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

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