2017-05-08 47 views
0

我使用Python 2.7(新的Python),我试图挽救电子邮件附件(使用exchangelib),在这里它工作得很好:FileAttachment的必须有一个帐户

for attachment in item.attachments: 
     if isinstance(attachment, FileAttachment): 
      local_path = os.path.join(filepath, attachment.name) 
      with open(local_path, 'wb') as f: 
       f.write(attachment.content) 

我的问题是当我尝试保存添加邮件项目(附加到邮件)的邮件附件时,添加的邮件包含文件。

elif isinstance(attachment, ItemAttachment): 
      if isinstance(attachment.item, Message): 
       os.makedirs(filepath+"attachedMail") 
       attachedmailpath=filepath+"attachedMail/" 
       new_item=attachment.item 
       for attachment in new_item.attachments: 
        if isinstance(attachment, FileAttachment): 
         local_path=os.path.join(attachedmailpath,attachment.name) 
         with open(local_path, 'wb') as f: 
          f.write(attachment.content) 

当我运行这段代码会创建一个与它的名称的文件,但它并没有写在它的问题是在f.write(attachment.content)

的出现的错误是:

raise ValueError('%s must have an account' % self.__class__.__name__) 
ValueError: FileAttachment must have an account 

对不起,我的英语和感谢!

+0

请https://github.com/ecederstrand/exchangelib/issues文件为这个错误应该可以从该被自身添加为附件的电子邮件附件获得。 –

回答

0

它是一种已知的错误:https://github.com/ecederstrand/exchangelib/issues/210

解决方法是手动分配根电子邮件作为parent_item到每个密闭消息。以下代码以递归方式进入每个附件,实施解决方法。

... 
for MailItem in FilteredMail: 
    ReadAttachments(MailItem, MailItem) 

def ReadAttachments(MailItem, RootParent) 
    for Attachment in MailItem.attachments 
     Attachment.parent_item = RootParent 
     if hasattr(Attachment, 'item'): #attachment is a message (exchange object) 
      ReadAttachments(Atachment.item, RootParent) 
     else:  #attachment is a regular file (e.g. DOC, PDF) 
      print Attachment.name + ':' + Attachment.size 
      <do whatever with Attachment.content> 
相关问题