3

我正在尝试编写一个程序来监视 IMAP 邮箱并自动将每条新传入消息复制到“存档”文件夹中。我正在使用实现 IDLE 命令的 imaplib2。这是我的基本程序:

M = imaplib2.IMAP4("mail.me.com")
M.login(username,password)
lst = M.list()
assert lst[0]=='OK'
for mbx in lst[1]:
    print "Mailboxes:",mbx

def process(m):
    print "m=",m
    res = M.recent()
    print res


M.select('INBOX')
M.examine(mailbox='INBOX',callback=process)
while True:
    print "Calling idle..."
    M.idle()
    print "back from idle"
M.close()
M.logout()

它正确打印邮箱并在邮箱发生第一次更改时运行 process()。但是最近()的响应对我来说没有意义,在第一条消息之后,我再也没有收到任何其他通知。

有人知道怎么做吗?

4

2 回答 2

2

我发现 recent() 有点模糊(这是 IMAP 模糊性,而不是 imaplib2)。在空闲之前和之后保留消息号列表似乎更好,不同之处在于新消息。

然后使用 fetch(messages,"UID") 获取消息 uid。

于 2010-03-25T00:48:00.340 回答
1

请参阅python-imap-idle-with-imaplib2中的示例和参考。模块涉及线程,要注意事件同步。

该示例建议与事件同步,并将邮件处理留给读者:

# The method that gets called when a new email arrives. 
# Replace it with something better.
def dosync(self):
    print "Got an event!"

从问题中得到提示,“更好的东西”可以是:

# Replaced with something better.
def dosync(self):
    print "Got an event!"
    res = self.M.recent()
    print res
于 2010-01-12T06:31:40.327 回答