5

簡単に言うと、新しいGmailアカウントを作成し、他のいくつかのアカウントをそのアカウントにリンクしました(それぞれに数千のメッセージがあります)。これをインポートしています。インポートされたメッセージはすべて未読として届きますが、既読として表示する必要があります。

私はPythonの経験が少しありますが、メールの送信にはメールとimaplibモジュールのみを使用し、アカウントの処理には使用していません。

受信トレイ内のすべてのアイテムを一括処理し、指定した日付より古いメッセージを既読としてマークする方法はありますか?

4

4 に答える 4

8
typ, data = M.search(None, '(BEFORE 01-Jan-2009)')
for num in data[0].split():
   M.store(num, '+FLAGS', '\\Seen')

これは、storeメソッドのimaplibドキュメントページのコードを少し変更したものです。RFC3501から使用する検索条件を見つけました。これで始められるはずです。

于 2009-08-18T21:25:53.527 に答える
2

上記のPhilipT.の回答とRFC3501および RFC2822に基づいて、10日以上経過したメールを既読としてマークするためのコード行をいくつか作成しました。月の省略名には静的リストが使用されます。これは特に洗練されたものではありませんが、Pythonの%bフォーマット文字列はロケールに依存しているため、不快な驚きを与える可能性があります。すべてのIMAPコマンドはUIDベースです。

import imaplib, datetime

myAccount = imaplib.IMAP4(<imapserver>)
myAccount.login(<imapuser>, <password>)
myAccount.select(<mailbox>)

monthListRfc2822 = ['0', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
beforeDate = datetime.datetime.today() - datetime.timedelta(days = 10)
beforeDateString = ("(BEFORE %s-%s-%s)"
                    % (beforeDate.strftime('%d'),
                       monthListRfc2822[beforeDate.month],
                       beforeDate.strftime('%Y')))
typ, data = myAccount.uid('SEARCH', beforeDateString)
for uid in data[0].split():
    myAccount.uid('STORE', uid, '+FLAGS', '(\Seen)')

ちなみに、私の場合(dovecot IMAPサーバー)の検索文字列で日付区切り文字として「-」を使用する必要があった理由はわかりません。私には、RFC 2822と矛盾しているように見えます。ただし、区切り文字として単純な空白を含む日付は、IMAPエラーのみを返しました。

于 2012-01-05T09:57:47.337 に答える
1

HTMLを解析しようとするのではなく、IMAPインターフェイスを使用しないのはなぜですか。標準のメールクライアントに接続し、日付で並べ替えて、読みたいものにマークを付けます。

于 2009-08-18T20:55:42.683 に答える
1

Gmailのウェブインターフェースにアクセスし、日付で詳細検索を行ってから、すべてを選択して既読のマークを付けます。

于 2009-08-18T20:57:09.607 に答える