使用Python解析Gmail并将所有旧日期标记为“已读”

时间:2009-08-18 20:52:28

标签: python email gmail imap pop3

长话短说,我创建了一个新的Gmail帐户,并将其他几个帐户链接到每个帐户(每个帐户有1000条消息),我正在导入。所有导入的邮件都是未读的,但我需要它们显示为已读。

我对python有一点经验,但我只使用mail和imaplib模块发送邮件,而不是处理帐户。

有没有办法批量处理收件箱中的所有项目,只需将早于指定日期的邮件标记为已读?

4 个答案:

答案 0 :(得分:8)

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

这是对商店方法imaplib doc page中代码的略微修改。我找到了RFC 3501中使用的搜索条件。这应该可以帮到你。

答案 1 :(得分: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错误。

答案 2 :(得分:1)

而不是尝试解析我们的HTML,为什么不使用IMAP接口呢?将其连接到标准邮件客户端,然后按日期排序并标记您想要读取的任何内容。

答案 3 :(得分:1)

只需转到Gmail网络界面,按日期进行高级搜索,然后选择全部并标记为已读。