用Python解析Gmail并将所有早于某日期的邮件标记为“已读”

5 投票
4 回答
6196 浏览
提问于 2025-04-15 13:41

简单来说,我新建了一个 Gmail 账号,并把几个其他账号(每个账号都有上千封邮件)链接到这个新账号上,现在我正在导入这些邮件。所有导入的邮件都显示为未读,但我希望它们能显示为已读。

我对 Python 有一点了解,但我只用过 mail 和 imaplib 模块来发送邮件,而不是处理账号。

有没有办法批量处理收件箱里的所有邮件,把指定日期之前的邮件直接标记为已读呢?

4 个回答

1

只需打开Gmail的网页界面,进行按日期的高级搜索,然后全选并标记为已读。

2

根据上面Philip T.的回答,以及RFC 3501RFC 2822的内容,我写了一些代码,用来把超过10天的邮件标记为已读。我用了一份静态列表来存储缩写的月份名称。虽然这样做不是特别优雅,但因为Python的%b格式字符串会受到地区设置的影响,这可能会带来一些意想不到的问题。所有的IMAP命令都是基于UID的。

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

顺便说一下:我不知道为什么在我的情况下(dovecot IMAP服务器)搜索字符串中必须使用“-”作为日期分隔符。这让我觉得和RFC 2822的内容有些矛盾。不过,使用简单的空格作为分隔符只会返回IMAP错误。

9
typ, data = M.search(None, '(BEFORE 01-Jan-2009)')
for num in data[0].split():
   M.store(num, '+FLAGS', '\\Seen')

这是对imaplib文档页面中store方法代码的一个小修改。我从RFC 3501找到了使用的搜索条件。这应该能帮助你入门。

撰写回答