我正在寻找有关如何在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");
答案 0 :(得分:2)
我在Delphi中阅读了一些教程,但确实感到困惑。
毫不奇怪,因为IMAP通常是一个复杂且令人困惑的协议。这就是TIdIMAP4
与其他邮箱协议(如TIdPOP3
和TIdSMTP
相比具有更多方法的原因(并且它甚至不实现IMAP能够实现的所有内容)。
例如,选择邮箱后我该怎么办?
ImapClient-> UIDRetrieve()或ImapClient-> RetrieveStructure()或ImapClient-> RetrievePart()od ImapClient-> RetrieveEnvelop()。
这实际上取决于您打算如何处理电子邮件及其附件。
(UID)Retrieve()
下载整封电子邮件,将其解析为TIdMessage
并在服务器上将其标记为“已读”。
(UID)RetrieveStructure()
检索电子邮件中各种MiME部分的父/子层次结构,为TIdMessage.MessageParts
或TIdImapMessageParts
集合中的每个部分创建条目,提供有关的一些基本描述性信息每个部分,如内容类型和部件号。不检索每个部分的实际内容。
(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
。