长话短说,我创建了一个新的 gmail 帐户,并将其他几个帐户链接到它(每个帐户都有 1000 条消息),我正在导入这些帐户。所有导入的邮件都以未读的形式到达,但我需要它们显示为已读。
我对 python 有一点经验,但是我只使用了 mail 和 imaplib 模块来发送邮件,而不是处理帐户。
有没有办法批量处理收件箱中的所有项目,并将早于指定日期的邮件标记为已读?
typ, data = M.search(None, '(BEFORE 01-Jan-2009)')
for num in data[0].split():
M.store(num, '+FLAGS', '\\Seen')
这是对imaplib 文档页面中 store 方法的代码的轻微修改。我从RFC 3501中找到了要使用的搜索条件。这应该让你开始。
根据 Philip T. 的上述回答以及RFC 3501和 RFC 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 错误。
与其尝试解析我们的 HTML,为什么不直接使用 IMAP 接口呢?将其连接到标准邮件客户端,然后只需按日期排序并将您想要的任何一个标记为已读。
只需转到 Gmail 网络界面,按日期进行高级搜索,然后全选并标记为已读。