Home > database >  Marking an email as read python
Marking an email as read python

Time:08-03

I'd like to mark an email as read from my python code. I'm using

from exchangelib import Credentials, Account
my_account = Account(...)
credentials = Credentials(...)

to get access to the account. This part works great. I then get into my desired folder using this

var1 = my_account.root / 'branch1' / 'desiredFolder'

Again, this works great. This is where marking it as read seems to not work.

item = var1.filter(is_read=False).values('body')
for i, body in enumerate(item):
   #Code doing stuff
   var1.filter(is_read=False)[i].is_read = True
   var1.filter(is_read=False)[i].save(updated_fields=['is_read'])

I've tried the tips and answers from this post Mark email as read with exchangelib, but the emails still show as unread. What am I doing wrong?

CodePudding user response:

I think you the last line of code that you save() do not work as you think that after you set is_read of unread[i] element to True, this unread[i] of course not appear in var1.filter(is_read=False)[i] again, so you acttually did not save this.
I think this will work.

for msg in my_account.inbox.filter(is_read=False):
    msg.is_read = True
    msg.save(updated_fields=['is_read'])

CodePudding user response:

To expand on @Thang9's answer, the reason your code doesn't work is that you are calling .save() on a different Python object than the object you are setting the is_read flag on. Every time you call var1.filter(is_read=False)[i], a new query is sent to the server, and a new Python object is created.

Additionally, since you didn't specify a sort order (and new emails may be incoming while the code is running), you may not even be hitting the same email each time you call var1.filter(is_read=False)[i].

  • Related