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

标签 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) 类似,但创建的文件始终为空。

最佳答案

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

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

我建议您使用 UIDRetrieveStructure() 的其他重载版本来填充 TIdImapMessageParts。除此之外,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;

关于delphi - 如何将电子邮件附件保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35778642/

相关文章:

node.js - 使用 Node.js 4.3 从 MIME 电子邮件中提取附件

delphi - 使用 Delphi 实现 nsIProtocolHandler

android - Android Play 商店中的 Delphi 11 应用程序显示警告 : Non-SDK API

javascript - 如何删除 Base64 编码图像中的开头字符串?

java - 如何在java中发送带有多个附件的邮件

c# - 如何删除作为附件的图像但显示在电子邮件正文中

delphi - 如何使用 "for/in"查找另一个组件内部的组件?

delphi - 在 Delphi 中立即运行下一行

Javascript window.atob -> HEX - 结果与预期不同

html - 为什么不在 WYGIWYS 编辑器中将图像作为 base64 字符串嵌入