Gmailのメールボックスに、ヘッダーが少し壊れたメッセージがたくさんあります。PythonとGmailのimapインターフェースを使用してそれらを自動的に処理および更新したいと思います。メッセージをダウンロードし、ヘッダーをローカルで変更してから、サーバーで削除してから、修正されたメッセージを追加し直したいと思います。問題は、メッセージが適切に削除されているように見えても、古いメッセージを追加し直した後も、不良ヘッダーが残っていることです。複雑なことに、Gmailでメッセージを手動で削除してから、Pythonで同じコマンドを使用してメッセージを追加すると、新しい適切なヘッダーが希望どおりに表示されます。
>>> import imaplib
>>> import email
>>> mail = imaplib.IMAP4_SSL('imap.gmail.com')
>>> mail.login('user@gmail.com', 'password')
>>> mail.select('label')
('OK', ['2'])
>>> mail.search(None, 'from', 'bad_string')
('OK', ['2'])
>>> ret,data = mail.fetch('2', '(RFC822)')
>>> msg = email.message_from_string(data1[0][1])
>>> msg['from']
'"Doe, John" <john.doe@bad_string.com>'
>>> new = msg['from'].replace('bad_string', 'good_string')
>>> msg.replace_header('From', new)
>>> msg['from']
'"Doe, John" <john.doe@good_string.com>'
>>> mail.store('2', '+FLAGS', '\\Deleted')
('OK', ['2 (FLAGS (\\Seen \\Deleted))'])
>>> mail.expunge()
('OK', ['2'])
>>> mail.search(None, 'from', 'bad_string')
('OK', [''])
>>> mail.select('label')
('OK', ['1'])
この時点で、Pythonはメールが削除されたと見なしているようです。Gmailのウェブインターフェースをチェックインすると、それもなくなったように見えます。ラベルには最初の2通ではなく1通のメールしかなく、検索では空が返されます。
>>> mail.append('label', None, '"20-Jul-2012 22:30:00 -0400"', str(msg))
('OK', ['[APPENDUID 24 13] (Success)'])
>>> mail.search(None, 'from', 'bad_string')
('OK', ['2'])
>>> mail.search(None, 'from', 'good_string')
('OK', [''])
しかし、メッセージは元の不正な文字列で戻ってきました。ただし、プログラムで削除して消去するのではなく、Gmailのウェブインターフェースでゴミ箱を削除して空にしてから追加する場合(上記と同じPythonセッションであるため、上記の出力の直後にこれを実行します)...
>>> mail.append('label', None, '"20-Jul-2012 22:30:00 -0400"', str(msg))
('OK', ['[APPENDUID 24 14] (Success)'])
>>> mail.search(None, 'from', 'bad_string')
('OK', [''])
>>> mail.search(None, 'from', 'good_string')
('OK', ['2'])
GmailのIMAP設定は次のとおりです。
- IMAPでメッセージを削除済みとしてマークすると、次のようになります。自動消去オフ-クライアントがサーバーを更新するのを待ちます。
- メッセージが削除済みとしてマークされ、最後に表示されたIMAPフォルダから消去された場合:メッセージをすぐに完全に削除します