2016-03-03 394 views
3

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

回答

3

使用UIDRetrieveStructure()TIdMessage将会有很多TIdttachment对象,从来没有任何TIdText对象,以填补TIdMessage.MessageParts,而不是所有的对象都将代表实际的附件。您正在使用TIdAttachment索引作为APartNum参数UIDRetrievePartToFile(),这可能不准确。

而且当您使用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; 
+0

谢谢你,它的工作原理!只需lParams [lJ] .ImapPartNumber是lParts [lJ] .ImapPartNumber – user1573626

相关问题