代码之家  ›  专栏  ›  技术社区  ›  vy32

查找上次使用python imaplib2后添加到IMAP邮箱的新邮件?

  •  3
  • vy32  · 技术社区  · 14 年前

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

    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()。但是recent()的响应对我没有意义,在第一条消息之后,我再也没有收到任何其他通知。

    有人知道怎么做吗?

    2 回复  |  直到 13 年前
        1
  •  1
  •   gimel    14 年前

    参见中的示例和参考 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
    
        2
  •  1
  •   Paul    14 年前

    我发现recent()有点模糊(这是一个imap模糊,而不是imaplib2)。最好在空闲前后保留一个消息编号列表,区别在于新消息。

    然后使用fetch(消息,“uid”)获取消息uid。