Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python解析Gmail,并将所有早于日期的标记为;改为;_Python_Email_Gmail_Imap_Pop3 - Fatal编程技术网

用Python解析Gmail,并将所有早于日期的标记为;改为;

用Python解析Gmail,并将所有早于日期的标记为;改为;,python,email,gmail,imap,pop3,Python,Email,Gmail,Imap,Pop3,长话短说,我创建了一个新的gmail帐户,并将其他几个帐户链接到它(每个帐户都有1000条消息),我正在导入。所有导入的邮件到达时都是未读的,但我需要它们显示为已读 我对python有一点经验,但我只使用mail和imaplib模块来发送邮件,而不是处理帐户 有没有一种方法可以批量处理收件箱中的所有邮件,并简单地将超过指定日期的邮件标记为已读?而不是尝试解析我们的HTML为什么不使用IMAP界面?将它连接到一个标准邮件客户端,然后按日期排序,并将任何一个标记为已读。只需转到Gmail web界面

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

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


有没有一种方法可以批量处理收件箱中的所有邮件,并简单地将超过指定日期的邮件标记为已读?

而不是尝试解析我们的HTML为什么不使用IMAP界面?将它连接到一个标准邮件客户端,然后按日期排序,并将任何一个标记为已读。

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

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

这是对store方法中的代码的轻微修改。我找到了要从中使用的搜索条件。这应该让你开始了。

基于上面Philip T.的回答,我构建了一些代码行,将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)')
导入imaplib,日期时间
myAccount=imaplib.IMAP4()
myAccount.login(,)
myAccount.select()
monthListRfc2822=['0'、'1'、'2'、'3'、'4'、'5'、'6',
‘七月’、‘八月’、‘九月’、‘十月’、‘十一月’、‘十二月’]
beforeDate=datetime.datetime.today()-datetime.timedelta(天=10)
beforeDateString=((在%s-%s-%s之前)
%(在.strftime(“%d”)之前,
monthListRfc2822[日期之前的月份],
beforeDate.strftime(“%Y”))
类型,data=myAccount.uid('SEARCH',beforeDateString)
对于数据[0]中的uid。拆分()
myAccount.uid('STORE',uid',+FLAGS','(\Seen'))

顺便说一句:我不知道,在我的案例(dovecot IMAP服务器)中,为什么必须在搜索字符串中使用“-”作为日期分隔符。在我看来,这似乎与RFC2822相矛盾。但是,使用简单空格作为分隔符的日期只返回IMAP错误。

因为它没有那么有趣?明确地说,我的目标是使用Imap接口,但我正在尝试学习一个新技巧。我不想在我的计算机上安装一个邮件客户端,从技术上讲,如果没有它,这应该是可能的。啊,好吧,我没有意识到乐趣是这个项目的首要任务;)对我来说,它会弹出一条小消息,上面写着“此页面上的所有20个对话都已选中。请选择与此搜索匹配的所有对话”,然后您可以选择所有邮件。谢谢!这正是我要找的!对我来说,日期格式(自2011年1月1日起)有效,例如,DD-MMM-YYYY,thxThanks For the heads up,dhaval。我纠正了这个例子。这对我很有用。