在不读取整个对象的情况下在 Exchange 中设置 is_read
Setting is_read in Exchange without reading the whole object
我正在尝试从一堆电子邮件中快速读取一些信息,而不是拉出整个对象并将邮件项目设置为已读。尤其是,因为大多数电子邮件都有很大的附件,所以我不想提取它们。为此,我尝试如下操作:
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 来节省内存使用的目的。还有其他想法吗?我有什么遗漏吗?
您可以告诉 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)
我正在尝试从一堆电子邮件中快速读取一些信息,而不是拉出整个对象并将邮件项目设置为已读。尤其是,因为大多数电子邮件都有很大的附件,所以我不想提取它们。为此,我尝试如下操作:
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 来节省内存使用的目的。还有其他想法吗?我有什么遗漏吗?
您可以告诉 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)