我想使用Indy Ver.10的TIdImap4对象将电子邮件附件保存到文件中。
我收到了电子邮件的UID,然后我使用了这段代码:
lMsg := TIdMessage.Create(Self);
lImap.UIDRetrieveStructure(lUid, lMsg);
lMsg.MessageParts.CountParts;
if lMsg.MessageParts.AttachmentCount > 0 then
for lJ := 0 to lMsg.MessageParts.Count - 1 do
if (lMsg.MessageParts[lJ] is TIdAttachment) and
SameText(lMsg.MessageParts[lJ].Name, 'MyAttachment') then
lImap.UidRetrievePartToFile(lUid, lJ, lDimAllegato, lFileName, Trim(lMsg.MessageParts[lJ].ContentTransfer))
直到lMsg.MessageParts[lJ].ContentType = 'Text/Plain'
和。{
lMsg.MessageParts[lJ].ContentTransfer = '7bit'
,现在UidRetrievePartToFile()
返回False,没有创建文件。我想因为
lMsg.MessageParts[lJ].ContentType = 'application/octet-stream'
和
lMsg.MessageParts[lJ].ContentTransfer = 'base64'
。
我对这个主题不熟悉,为了保存这种类型的附件,我需要在代码中进行哪些更改?
我也尝试过:TIdAttachment(lMsg.MessageParts[lJ]).SaveToFile(lFileName)
和类似的,但创建的文件总是空的。
答案 0 :(得分:3)
将UIDRetrieveStructure()
与TIdMessage
一起使用会在TIdMessage.MessageParts
中填充大量TIdttachment
个对象,而不是任何TIdText
个对象,而不是全部对象将代表实际的附件。您使用TIdAttachment
索引作为APartNum
的{{1}}参数,这可能不准确。
在使用UIDRetrievePartToFile()
时,您无法使用TIdAttachment.SaveToFile()
,因为没有下载实际数据,只有电子邮件的结构,然后允许您下载特定数据你想要的元素。
我建议您使用填充UIDRetreiveStructure()
的{{1}}的其他重载版本。除其他事项外,UIDRetrieveStructure()
会为您提供准确的TIdImapMessageParts
,然后您可以将其提供给TIdImapMessagePart
(以及ImapPartNumber
):
UIDRetrievePartToFile()