【问题描述】使用Python如何批量修改邮件的阅读状态呢?
以下图为例,

如何将2021/04/09-05/01的已读邮件标记成未读呢?
如何将2021/04/09-/05/01的所有阿里云邮件标记成已读呢?
【小千解答】使用imapclient库的IMAPClient类的remove_flags和set_flags方法。


示例代码如下:
import imapclient
import datetime as dt
from email.parser import BytesParser
from email.policy import default
with imapclient.IMAPClient('imap.163.com') as xqmail:
xqmail.login('shaoqian9527@163.com','xqoffice.cn')
xqmail.id_({'name':'IMAPClient','version':'2.2.0'})
xqmail.select_folder('INBOX',False)
# 将已读邮件标记成未读
mids = xqmail.search([u'SEEN',u'SINCE',dt.date(2021,4,9),u'BEFORE',dt.date(2021,5,2)])
for idx,mid in enumerate(mids):
mail = xqmail.fetch(mid,['BODY.PEEK[]'])
xqmail.remove_flags(mail,b'\\Seen')
# 将阿里云邮件标记成已读
mids = xqmail.search([u'SINCE',dt.date(2021,4,9),u'BEFORE',dt.date(2021,5,2)])
for idx,mid in enumerate(mids):
mail = xqmail.fetch(mid,['BODY.PEEK[]'])
raw_msg = mail[mid][b'BODY[]']
msg = BytesParser(policy=default).parsebytes(raw_msg)
if 'system@notice.aliyun.com' in msg['From']:
xqmail.set_flags(mail,b'\\Seen')运行结果:

【注意事项】
1. 邮箱的客户端收信选项默认是“收取最近30天邮件”,本示例处理的邮件距今不止一个月了,故应改成“收取全部邮件”。

2. select_folder(folder, readonly=False)方法的第2参数是readonly,因为要修改邮件的阅读状态,故第2参数应设置为False。
3. fetch(messages, data, modifiers=None)方法的第2参数推荐用BODY.PEEK[]代替BODY[],是因为使用BODY[]有可能会在读取邮件的同时隐式地将邮件变成已读状态。

【参考资料】
图书《AUTOMATE THE BORING STUFF WITH PYTHON》