6. Exchangelib3.2官方文档 —— 批量操作

# 创建多个待办项
from exchangelib import Account, CalendarItem, EWSDateTime, EWSTimeZone, Attendee, Mailbox
from exchangelib.properties import DistinguishedFolderId

a = Account(...)
tz = EWSTimeZone.timezone('Europe/Copenhagen')
year, month, day = 2016, 3, 20
calendar_items = []
for hour in range(7, 17):
    calendar_items.append(CalendarItem(
        start=tz.localize(EWSDateTime(year, month, day, hour, 30)),
        end=tz.localize(EWSDateTime(year, month, day, hour + 1, 15)),
        subject='Test item',
        body='Hello from Python',
        location='devnull',
        categories=['foo', 'bar'],
        required_attendees = [Attendee(
            mailbox=Mailbox(email_address='user1@example.com'),
            response_type='Accept'
        )]
    ))

# 同时创建多项
return_ids = a.bulk_create(folder=a.calendar, items=calendar_items)

# 当知道'id'时,可以通过'Account.fetch'批量获取对象,返回一个生成器
calendar_ids = [(i.id, i.changekey) for i in calendar_items]
items_iter = a.fetch(ids=calendar_ids)
# 可以使用'only_fields'属性只返回需要内容
items_iter = a.fetch(ids=calendar_ids, only_fields=['start', 'subject'])

# 批量更新,每个都必须指定要更新的属性列表
updated_ids = a.bulk_update(items=[(i, ('start', 'subject')) for i in calendar_items])

# 移动至其他文件夹
new_ids = a.bulk_move(ids=calendar_ids, to_folder=a.other_calendar)

# 批量发送邮件草稿
message_ids = a.drafts.all().only('id', 'changekey')
new_ids = a.bulk_send(ids=message_ids, save_copy=False)

# 批量删除
delete_results = a.bulk_delete(ids=calendar_ids)

# 批量归档
delete_results = a.bulk_archive(ids=calendar_ids, to_folder=DistinguishedFolderId('inbox'))

# 从queryset中批量删除
a.inbox.filter(subject__startswith='Invoice').delete()

# 同样可以从QuerySet中批量发送、拷贝、移动和归档邮件
a.drafts.filter(subject__startswith='Invoice').send()
# 所有参数都会传递到账户实例的批处理方法中
a.drafts.filter(subject__startswith='Invoice').send(save_copy=False)
a.inbox.filter(subject__startswith='Invoice').copy(to_folder=a.inbox / 'Archive')
a.inbox.filter(subject__startswith='Invoice').move(to_folder=a.inbox / 'Archive')
a.inbox.filter(subject__startswith='Invoice').archive(to_folder=DistinguishedFolderId('inbox'))

# 如果服务器响应缓慢,可以更改批量操作的默认页面大小
a.inbox.filter(subject__startswith='Invoice').delete(page_size=25)

搜索

搜索功能API和Django的queryset API类似,并且支持大部分API。

from datetime import timedelta
from exchangelib import Account, EWSDateTime, FolderCollection, Q, Message

a = Account(...)
all_items = a.inbox.all()  # 获得所有项
# 链接多个过滤以优化查询
filtered_items = a.inbox.filter(subject__contains='foo').exclude(categories__icontains='bar')

# 可以使用get()函数来获取指定id或changekey的实例
a.inbox.get(id='AAMkADQy=')
a.inbox.get(id='AAMkADQy=', changekey='FwAAABYA')

# QuerySet可以像普通的Python列表一样进行索引和切片操作
first_ten = a.inbox.all().order_by('-subject')[:10]  # 高效,只获取前10个
last_ten = a.inbox.all().order_by('-subject')[:-10]  # 高效但有些繁琐

# filter()还支持Q对象,和Django的Q对象类似,用于构建复杂的布尔逻辑搜索表达式
q = (Q(subject__iexact='foo') | Q(subject__contains='bar')) & ~Q(subject__startswith='baz')
a.inbox.filter(q)

# 过滤语法也适用于文件夹集合,因此您可以在一个请求中搜索多个文件夹
a.inbox.children.filter(subject='foo')
a.inbox.walk().filter(subject='foo')

# 可以使用FolderCollection来搜索
FolderCollection(account=a, folders=[a.inbox, a.calendar]).filter(subject='foo')

会议日程

CalendarItem类允许您发送您发起的会议的请求或取消之前已经安排的会议。

from exchangelib import Account, CalendarItem, EWSDateTime
from exchangelib.items import MeetingRequest, MeetingCancellation, SEND_TO_ALL_AND_SAVE_COPY

a = Account(...)

# 创建会议请求并将其发送出去
item = CalendarItem(
    account=a,
    folder=a.calendar,
    start=a.default_timezone.localize(EWSDateTime(2019, 1, 31, 8, 15)),
    end=a.default_timezone.localize(EWSDateTime(2019, 1, 31, 8, 45)),
    subject="Subject of Meeting",
    body="Please come to my meeting",
    required_attendees=['anne@example.com', 'bob@example.com']
)
item.save(send_meeting_invitations=SEND_TO_ALL_AND_SAVE_COPY)

联系人

获取联系人只需使用.people()方法:

# 移动到联系人文件夹并开始搜索
from exchangelib import Account, DistributionList
from exchangelib.indexed_properties import EmailAddress

a = Account(...)
folder = a.root / 'AllContacts'
for p in folder.people():
    print(p)
for p in folder.people().only('display_name').filter(display_name='john').order_by('display_name'):
    print(p)

# 从GAL文件夹获取指定联系人
gal = a.contacts / 'GAL Contacts'
contact = gal.get(email_addresses=EmailAddress(email='lucas@example.com'))
# 所有使用Gmail的联系人
gmail_contacts = list(gal.filter(email_addresses__contains=EmailAddress(email='gmail.com')))
# 所有Gmail邮件地址
gmail_addresses = [e.email for c in gal.filter(email_addresses__contains=EmailAddress(email='gmail.com'))
                   for e in c.email_addresses]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值