1

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フォルダから消去された場合:メッセージをすぐに完全に削除します
4

1 に答える 1

0

したがって、もちろん、質問を投稿した直後に回答が明らかになります...重要な詳細は、「メッセージが削除済みとしてマークされ、最後に表示されたIMAPフォルダから消去されたとき」という行です。デフォルトでは、すべてのメールが表示可能なIMAPフォルダとして選択されているため、メッセージは常に少なくとも1つのフォルダに表示されます。私は2つの解決策があると信じています:

  1. 表示されているIMAPフォルダとして[すべてのメール]の選択を解除します。次に、[メッセージがマークされたとき...]オプションは、ラベルを削除および消去するときに最初に期待したとおりに動作します。「メッセージのアーカイブ」を選択すると、ラベルが削除され、すべてのメールに引き続き表示されます。「メッセージをゴミ箱に移動」を選択すると、メッセージはゴミ箱のラベルに移動されます。「永久削除」を選択すると、メッセージは完全に削除されます。

  2. 表示可能なIMAPフォルダとして選択されたすべてのデフォルトフォルダとデフォルトのIMAP設定を使用して、現在のラベルのメッセージに対して操作を実行する代わりに、メッセージを[[Gmail] /ゴミ箱]ラベルにコピーして、[ゴミ箱のラベルを付けて、そこにあるすべてのものを削除/消去します。これにより、メッセージが完全に削除されます。

于 2012-07-21T12:32:45.670 に答える