【问题标题】:Find new messages added to an imap mailbox since I last checked with python imaplib2?查找自从我上次使用 python imaplib2 检查后添加到 imap 邮箱的新消息?
【发布时间】:2011-01-04 01:27:30
【问题描述】:

我正在尝试编写一个程序来监控 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()。但是最近()的响应对我来说没有意义,并且在第一条消息之后我再也没有收到任何其他通知。

有人知道怎么做吗?

【问题讨论】:

    标签: python imap python-idle imaplib


    【解决方案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
    

    【讨论】:

    • 谢谢。但是代码只在每次返回消息时发出警报;如何获取消息的 UID,以便我可以使用它做些什么?
    • 谢谢。我现在正在制作一个应用程序!
    【解决方案2】:

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

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

    【讨论】:

    • 是的。最近()最终对我不起作用。我也遇到了 imaplib2() 的问题——它在运行几个小时后就冻结了。不知道如何继续...您有有效的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2011-01-05
    • 2012-04-22
    • 2015-12-03
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多