众所周知,各种文件夹都是Account类的属性,例如account.root,account.calendar,account.trash,account.inbox,account.outbox,account.sent,account.junk,account.tasks和account.contacts等。
# 浏览文件夹树、搜索文件夹有多种方法。如果文件夹名称包含斜杠,那么使用通配符查找可能会产生意外结果。
# 在第一次访问文件夹层次结构后,将会缓存整个结构。这意味着在清除缓存之前,外部程序更改文件夹结构将不会显示出来。以下是如何清除各层文件夹结构的缓存:
from exchangelib import Account, Folder
a = Account(...)
a.root.refresh()
a.public_folders_root.refresh()
a.archive_root.refresh()
some_folder = a.root / 'Some Folder'
some_folder.parent
some_folder.parent.parent.parent
some_folder.root # 返回账户根目录,和Account.root一样
some_folder.children # 子文件夹生成器
some_folder.absolute # 以字符串形式返回绝对路径
some_folder.walk() # 返回当前文件夹的所有子文件夹
# 使用UNIX语法通配符,但大小写不敏感
some_folder.glob('foo*') # 返回匹配的子文件夹
some_folder.glob('*/foo') # 返回所有的名为'foo'的子文件夹
some_folder.glob('**/foo') # 返回所有的名为'foo'的文件夹
some_folder / 'sub_folder' / 'even_deeper' / 'leaf' # 和pathlib.Path类似,返回路径
# 您也可以在不使用缓存的情况下进入到指定文件夹。这类似于单斜杠语法,但不是从创建文件夹结构缓存开始。如果您的帐户包含大量文件夹,并且您已经知道准确路径,那么这将非常有用。
some_folder // 'sub_folder' // 'even_deeper' // 'leaf'
some_folder.parts # 以'Folder'实例返回当前文件夹及父文件夹
# tree() 以字符串形式返回给定路径下的子文件夹结构树
print(a.root.tree())
'''
root
├── inbox
│ └── todos
└── archive
├── Last Job
├── exchangelib issues
└── Mom
'''
# Folders对象有很多有用的计数器:
a.inbox.total_count
a.inbox.child_folder_count
a.inbox.unread_count
# 更新计数器
a.inbox.refresh()
# 可以创建、编辑、删除文件夹
f = Folder(parent=a.inbox, name='My New Folder')
f.save()
f.name = 'My New Subfolder'
f.save()
f.delete()
# 清空文件夹
f.empty()
# 清空并删除子文件夹
f.empty(delete_sub_folders=True)
# 递归删除所有的内容及子文件夹. 和`empty(delete_sub_folders=True)`累死,但是可以防止一些文件夹不被删除. 请小心使用!
f.wipe()