我想使用 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/