web-dev-qa-db-ja.com

受信トレイ以外のフォルダからGmailメッセージを取得できない(Python3の問題)

更新:私のコードはpython 2.6.5で機能しますが、python 3では機能しません(私は3.4.1を使用しています)。

「すべてのメール」または「送信済みメール」フォルダ内のメッセージを検索できません-例外が発生します:

_imaplib.error: SELECT command error: BAD [b'Could not parse command']
_

私のコード:

_import imaplib
m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("[email protected]","mypassword")
m.select("[Gmail]/All Mail")
_

m.select("[Gmail]/Sent Mail")を使用しても機能しません。

ただし、受信トレイからの読み取りは機能します。

_import imaplib
m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("[email protected]","mypassword")
m.select("inbox")
...
_

Mail.list()コマンドを使用して、フォルダー名が正しいことを確認しました。

_b'(\\HasNoChildren) "/" "INBOX"', 
b'(\\Noselect \\HasChildren) "/" "[Gmail]"',
b'(\\HasNoChildren \\All) "/" "[Gmail]/All Mail"', 
b'(\\HasNoChildren \\Drafts) "/" "[Gmail]/Drafts"', 
b'(\\HasNoChildren \\Important) "/" "[Gmail]/Important"', 
b'(\\HasNoChildren \\Sent) "/" "[Gmail]/Sent Mail"', 
b'(\\HasNoChildren \\Junk) "/" "[Gmail]/Spam"', 
b'(\\HasNoChildren \\Flagged) "/" "[Gmail]/Starred"', 
b'(\\HasNoChildren \\Trash) "/" "[Gmail]/Trash"'
_

私はこれらの質問の解決策に従っていますが、それらは私にとってはうまくいきません:
imaplib-Archive/All Mail for Gmailの正しいフォルダ名は何ですか?

PythonのGmailで送信済みメールを検索できません

以下は、が機能しない完全なサンプルプログラムですPython 3

_import imaplib
import email

m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("[email protected]","mypassword")
m.select("[Gmail]/All Mail")

result, data = m.uid('search', None, "ALL") # search all email and return uids
if result == 'OK':
    for num in data[0].split():
        result, data = m.uid('fetch', num, '(RFC822)')
        if result == 'OK':
            email_message = email.message_from_bytes(data[0][1])    # raw email text including headers
            print('From:' + email_message['From'])

m.close()
m.logout()
_

次の例外がスローされます。

_Traceback (most recent call last):
File "./eport3.py", line 9, in <module>
m.select("[Gmail]/All Mail")
File "/RVM/lib/python3/lib/python3.4/imaplib.py", line 682, in select
typ, dat = self._simple_command(name, mailbox)
File "/RVM/lib/python3/lib/python3.4/imaplib.py", line 1134, in _simple_command
return self._command_complete(name, self._command(name, *args))
File "/RVM/lib/python3/lib/python3.4/imaplib.py", line 965, in _command_complete
raise self.error('%s command error: %s %s' % (name, typ, data))
imaplib.error: SELECT command error: BAD [b'Could not parse command']
_

これは、対応するPython 2バージョン動作するものです)。

_import imaplib
import email

m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("[email protected]","mypassword")
m.select("[Gmail]/All Mail")

result, data = m.uid('search', None, "ALL") # search all email and return uids
if result == 'OK':
    for num in data[0].split():
        result, data = m.uid('fetch', num, '(RFC822)')
        if result == 'OK':
            email_message = email.message_from_string(data[0][1])    # raw email text including headers
            print 'From:' + email_message['From']

m.close()
m.logout()
_
18
Randy Dellinger

この答え で言及されているように:

二重引用符が送信されるように、m.select( '"[Gmail]/All Mail"')を使用してみてください。 imaplibが文字列を適切に引用していないのではないかと思うので、サーバーは[Gmail]/AllとMailの2つの引数のように見えます。

そして、それはpython v3.4.1

import imaplib
import email

m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("[email protected]","mypassword")
m.select('"[Gmail]/All Mail"')

result, data = m.uid('search', None, "ALL") # search all email and return uids
if result == 'OK':
    for num in data[0].split():
    result, data = m.uid('fetch', num, '(RFC822)')
    if result == 'OK':
        email_message = email.message_from_bytes(data[0][1])    # raw email text including headers
        print('From:' + email_message['From'])

m.close()
m.logout()
42
Ben