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() を実行します。しかし、recent() からの応答は意味がありません。また、最初のメッセージの後、他の通知を受け取ることはありません。

誰でもこれを行う方法を知っていますか?

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 に答える