【问题标题】:How to save an email attachment to file如何将电子邮件附件保存到文件
【发布时间】:2016-03-03 17:13:01
【问题描述】:

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

【问题讨论】:

    标签: delphi base64 email-attachments indy10


    【解决方案1】:

    UIDRetrieveStructure()TIdMessage 一起使用会用大量TIdttachment 对象填充TIdMessage.MessageParts,而不是任何TIdText 对象,并且并非所有对象都将代表实际附件。您将TIdAttachment 索引用作UIDRetrievePartToFile()APartNum 参数,这可能不准确。

    并且在使用UIDRetreiveStructure() 时不能使用TIdAttachment.SaveToFile(),因为没有下载实际数据,只有电子邮件的结构,然后您可以下载所需特定元素的数据。

    我建议您改用填充TIdImapMessagePartsUIDRetrieveStructure() 的另一个重载版本。除此之外,TIdImapMessagePart 会为您提供准确的ImapPartNumber,然后您可以将其提供给UIDRetrievePartToFile()(以及ContentTransferEncoding):

    lParts := TIdImapMessageParts.Create(nil);
    try
      lImap.UIDRetrieveStructure(lUid, lParts);
      for lJ := 0 to lParts.Count - 1 do
      begin
        if (lParts[lJ] is the desired attachment) then
        begin
          lImap.UidRetrievePartToFile(lUid, lParts[lJ].ImapPartNumber, lDimAllegato, lFileName, lParts[lJ].ContentTransferEncoding);
        end;
      end;
    finally
      lParts.Free;
    end;
    

    【讨论】:

    • 谢谢,它有效!只是 lParams[lJ].ImapPartNumber 是 lParts[lJ].ImapPartNumber
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2022-08-23
    • 2018-03-24
    • 2012-01-15
    • 2019-05-07
    • 1970-01-01
    相关资源
    最近更新 更多