【问题描述】使用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》