使用另一封邮件的解析日期搜索IMAP

2 投票
1 回答
4237 浏览
提问于 2025-04-17 01:30

我正在使用Python和imaplib,连接到两个IMAP服务器(都是Gmail),想要通过邮件的日期时间来匹配它们之间的邮件。

我遇到了两个问题。

  • 从邮件头解析出来的日期格式不对,不能直接用来搜索。
  • 我不太清楚应该用哪个IMAP搜索来根据解析出来的日期和时间进行搜索。

我有两个IMAP连接,一个是Oldmail,另一个是NewMail。

NewMail.select("[Gmail]/All Mail", readonly=True)
OldMail.select("[Gmail]/All Mail")

我随便选了一封邮件“6001”。

typ, msg = NewMail.fetch('6001', '(BODY[HEADER])')
parser = HeaderParser()
pmsg = parser.parsestr(msg[0][1])

>>> pmsg['Date']
'Tue, 28 Dec 2010 21:56:00 -0700'

但是这个格式不对,肯定有简单的方法可以解决这个问题:-)

searchfor = '(ON "' + pmsg['Date'] + '")'
>>> searchfor
'(ON "Tue, 28 Dec 2010 21:56:00 -0700")'
OldMail.search(None, searchfor)

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/imaplib.py", line 620, in search
    typ, dat = self._simple_command(name, *criteria)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/imaplib.py", line 1060, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/imaplib.py", line 895, in _command_complete
    raise self.error('%s command error: %s %s' % (name, typ, data))
error: SEARCH command error: BAD ['Could not parse command']

我的目标是找到这两个服务器之间匹配的邮件,因为使用谷歌的迁移应用时传输失败了。如果邮件已经成功转移,我想在旧服务器上删除这些邮件。如果你能建议一个更好的方法,那就太好了。

1 个回答

3

看起来问题只是日期格式的问题。在这种情况下,这段代码:

a = datetime.strptime(pmsg['Date'],"%a, %d %b %Y %H:%M:%S %z")

会给你一个日期时间对象,而这段代码:

searchfor = '(ON "%s")' %(a.strftime("%d-%b-%Y")

会给你相关的消息。

要注意的是,这样做会返回从那个日期开始的所有消息,因为它不考虑时间和时区的信息。

另外,你可以看看你的邮件,看看“Message-Id:”这个头部信息是否有帮助,因为对于真正重复的邮件,这个信息在每个账户上应该是一样的。

撰写回答