×

python 邮件 已读 未读 标记

使用Python批量修改邮件的阅读状态

鹭岛小千 鹭岛小千 发表于2021-06-21 22:30:43 浏览659 评论0

抢沙发发表评论

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

以下图为例,

17-1.png

  • 如何将2021/04/09-05/01的已读邮件标记成未读呢?

  • 如何将2021/04/09-/05/01的所有阿里云邮件标记成已读呢?


【小千解答】使用imapclient库的IMAPClient类的remove_flags和set_flags方法。

17-2.png

17-3.png


示例代码如下:

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')


运行结果:

17-4.png


【注意事项】

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

17-5.png

2. select_folder(folder, readonly=False)方法的第2参数是readonly,因为要修改邮件的阅读状态,故第2参数应设置为False

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


打赏码.png


【参考资料】

  1. IMAPClient Class

  2. 图书《AUTOMATE THE BORING STUFF WITH PYTHON》

  3. Python学习:通过IMAP收邮件

  4. pythion利用IMAPClient收取邮件并标记已读,触发jenkins

  5. rfc3501


群贤毕至

访客