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

时间:2016-01-11 18:59:24

标签: imap c++builder indy c++builder-xe8

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

例如,选择邮箱后我该怎么办?

ImapClient->UIDRetrieve()

ImapClient->RetrieveStructure()

ImapClient->RetrievePart()

ImapClient->RetrieveEnvelop().

然后,接下来我应该做些什么来识别MessagePart no,有附件?

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

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

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

但我不能创建像这样的声明

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

1 个答案:

答案 0 :(得分:2)

  

我在Delphi中阅读了一些教程,但确实感到困惑。

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

  

例如,选择邮箱后我该怎么办?

     

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

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

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

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

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

(UID)RetrieveEnvelope()检索电子邮件的一些基本顶级标题:date,subject,from,sender,reply-to,to,cc,bcc,in-reply-to和message-id。

  

然后,接下来我应该做些什么来识别MessagePart no,有附件?

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

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

  

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

如果您下载完整的电子邮件,则可以在所需的SaveToFile()对象上拨打TIdAttachment

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

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