2016-08-28 7 views
0

私のコードを見てGmailの...私が取得Pythonは、このような

import imaplib 
import email 
obj = imaplib.IMAP4_SSL('imap.gmail.com','993') 
obj.login('user','pass') 
obj.select('inbox') 
delete = [] 

for i in range(1, 10): 
    typ, msg_data = obj.fetch(str(i), '(RFC822)') 
    print i 
    x = i 
    for response_part in msg_data: 
    if isinstance(response_part, tuple): 
     msg = email.message_from_string(response_part[1]) 
     for header in [ 'subject', 'to', 'from', 'Received' ]: 
      print '%-8s: %s' % (header.upper(), msg[header]) 
      if header == 'from' and '<sender's email address>' in msg[header]: 
       delete.append(x) 
string = str(delete[0]) 
for xx in delete: 
    if xx != delete[0]: 
     print xx 
     string = string + ', '+ str(xx) 
print string 
obj.select('inbox') 
obj.uid('STORE', string , '+FLAGS', '(\Deleted)') 
obj.expunge() 
obj.close() 
obj.logout() 

エラーは、私がimaplibを使用して一度に複数のメールを削除する方法を探しています

Traceback (most recent call last): 
File "del_email.py", line 31, in <module> 
obj.uid('STORE', string , '+FLAGS', '(\Deleted)') 
File "C:\Tools\Python(x86)\Python27\lib\imaplib.py", line 773, in uid 
typ, dat = self._simple_command(name, command, *args) 
File "C:\Tools\Python(x86)\Python27\lib\imaplib.py", line 1088, in _simple_command 
return self._command_complete(name, self._command(name, *args)) 
File "C:\Tools\Python(x86)\Python27\lib\imaplib.py", line 918, in _command_complete 
raise self.error('%s command error: %s %s' % (name, typ, data)) 
imaplib.error: UID command error: BAD ['Could not parse command'] 

ですまたは他のモジュール。私は一番簡単な例を探しています。この例は、ここの最後の答えのUsing python imaplib to "delete" an email from Gmail?のリンクにあります。私は正しく働いていない。しかし、私はスクリプトが実行されるたびに1つの電子メールを削除するように働く第1の例を得ることができます。私はむしろスクリプトを数千回実行するよりも倍数でそれをやってみてください。私の主な目標は、imaplibを介して複数の電子メールを削除することです。回避策や他の作業モジュールや例が理解できます。

+0

「文字列」は何を印刷しますか? – Max

+0

コンマの後に空白があるようです。 UIDリストにはスペースが含まれていない可能性があります。 – Max

+0

文字列の文字列を '1,2,3'などの文字列で出力します。また、スペースを取り出して '1,2,3'と同じ問題が発生しました。 – killer

答えて

1

IMAPClientを使用すると、より簡単に低レベルのプロトコルの面倒を見ることができます。これは、単一のフェッチ()の呼び出しで複数のメッセージをフェッチするのではなく、それらを一つずつフェッチすることによって、より効率的にすることができたが、私が残してきた

from imapclient import IMAPClient 
import email 

obj = IMAPClient('imap.gmail.com', ssl=True) 
obj.login('user','pass') 
obj.select('inbox') 

delete = [] 
msg_ids = obj.search(('NOT', 'DELETED')) 
for msg_id in msg_ids: 
    msg_data = obj.fetch(msg_id, ('RFC822',)) 
    msg = email.message_from_string(msg_data[msg_id]['RFC822']) 
    for header in [ 'subject', 'to', 'from', 'Received' ]: 
     print '%-8s: %s' % (header.upper(), msg[header]) 
     if header == 'from' and '<senders email address>' in msg[header]: 
      delete.append(x) 

obj.delete_messages(delete) 
obj.expunge() 
obj.close() 
obj.logout() 

:あなたのコードをIMAPClient使用

は、次のようになりますそれは明確にするためです。

送信者のアドレスでフィルタリングしたい場合は、IMAPサーバーでフィルタリングを行うことができます。これにより、メッセージ本体をダウンロードする必要がなくなり、処理が大幅に高速化されます。

これは次のようになります。

from imapclient import IMAPClient 

obj = IMAPClient('imap.gmail.com', ssl=True) 
obj.login('user','pass') 
obj.select('inbox') 
msg_ids = obj.search(('NOT', 'DELETED', 'FROM', '<senders email address>')) 
obj.delete_messages(msg_ids) 
obj.expunge() 
obj.close() 
obj.logout() 

免責事項:私はIMAPClientの著者およびメンテナです。

+0

imaplib.abort:ソケットエラー:EOFエラー – killer

+0

例でIMAPClientインスタンスを作成する行が間違っていました。私はそれらを修正しました(ポート番号の代わりに "ssl = True"と書きます) –

+0

今回はOpenSSL.SSL.Errorを返しました:[] – killer

関連する問題