如何将电子邮件附件保存到文件

时间:2016-03-03 17:13:02

标签: delphi base64 email-attachments indy10

我想使用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) 和类似的,但创建的文件总是空的。

1 个答案:

答案 0 :(得分:3)

UIDRetrieveStructure()TIdMessage一起使用会在TIdMessage.MessageParts中填充大量TIdttachment个对象,而不是任何TIdText个对象,而不是全部对象将代表实际的附件。您使用TIdAttachment索引作为APartNum的{​​{1}}参数,这可能不准确。

在使用UIDRetrievePartToFile()时,您无法使用TIdAttachment.SaveToFile(),因为没有下载实际数据,只有电子邮件的结构,然后允许您下载特定数据你想要的元素。

我建议您使用填充UIDRetreiveStructure()的{​​{1}}的其他重载版本。除其他事项外,UIDRetrieveStructure()会为您提供准确的TIdImapMessageParts,然后您可以将其提供给TIdImapMessagePart(以及ImapPartNumber):

UIDRetrievePartToFile()