在Exchange中设置is_read而不读取整个对象

时间:2019-03-28 05:58:07

标签: python exchangelib

我正在尝试从一堆电子邮件中快速读取一些信息,而又不拉扯整个对象并将邮件项设置为已读。尤其是这样,由于大多数电子邮件都具有较大的附件,因此我不想将其拉出。为此,我尝试如下操作:

mail_filter = acct.inbox.filter(message_id__in=email_id_list).values_list("subject", "body", "datetime_received", "sender")

mail_filter.page_size = 2
for item in mail_filter.iterator():
    do_something_with_the_tuple_in_item()

# Now I want to set is_read = True. Something like below:
acct.inbox.filter(message_id__in=email_id_list).update(is_read=True)

虽然使用values_list可以避免获取整个邮件项目(否则似乎会占用大量内存,尤其是对于带有附件的电子邮件),但我发现过滤器上没有update()支持。因此,为了让我将电子邮件设置为is_read,我需要拉出对象(以内存为代价)并设置is_read = True,然后将save()返回。基本上,它无法通过使用values_list来节省内存使用的目的。还有其他想法吗?我想念什么吗?

1 个答案:

答案 0 :(得分:1)

您可以告诉exchangelib仅获取某些字段值,并且仅更新is_read字段。另外,如果您只想处理未读电子邮件,则可以在is_read值上添加一个过滤器:

for item in f.filter(is_read=False).only('is_read', 'subject', 'body', ...):
    item.is_read = True
    item.save(update_fields=['is_read'])

要减轻服务器负载,可以批量更新项目:

update_tuples = []
for item in f.filter(is_read=False).only('is_read', 'subject', 'body', ...):
    item.is_read = True
    # bulk_update() expects a list of (Item, fieldnames) tuples
    items_to_update.append((item, ['is_read']))

account.bulk_update(update_tuples)