Based on the answer of Philip T. above and RFC 3501 and RFC 2822 , I built a few lines of code to mark emails older than 10 days as read. For short month names, a static list is used. It's not particularly elegant, but the Python% b format string is language dependent, which can cause unpleasant surprises. All IMAP commands are UID based.
import imaplib, datetime myAccount = imaplib.IMAP4(<imapserver>) myAccount.login(<imapuser>, <password>) myAccount.select(<mailbox>) monthListRfc2822 = ['0', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] beforeDate = datetime.datetime.today() - datetime.timedelta(days = 10) beforeDateString = ("(BEFORE %s-%s-%s)" % (beforeDate.strftime('%d'), monthListRfc2822[beforeDate.month], beforeDate.strftime('%Y'))) typ, data = myAccount.uid('SEARCH', beforeDateString) for uid in data[0].split(): myAccount.uid('STORE', uid, '+FLAGS', '(\Seen)')
By the way: I donβt know why I had to use β-β as a date separator in the search bar in my case (dovecot IMAP server). It seems to me that this contradicts RFC 2822. However, dates with simple spaces as a separator only returned IMAP errors.
source share