无法从收件箱以外的任何文件夹中检索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("myemail@gmail.com","mypassword")
m.select("[Gmail]/All Mail")

使用m.select("[Gmail]/Sent Mail")也不工作。

但是从收件箱中读取有效:

import imaplib
m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("myemail@gmail.com","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 -什么是正确的文件夹名称存档/所有邮件在Gmail?

我无法用Python在Gmail中搜索发送的电子邮件

下面是一个完整的示例程序,不能在Python 3:

上工作。
import imaplib
import email
m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("myemail@gmail.com","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("myemail@gmail.com","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()

正如在这个回答中提到的:

试着使用m.select('"[Gmail]/All Mail"'),这样双引号就可以发送了。我怀疑imaplib没有正确引用字符串,所以服务器得到看起来像两个参数:[Gmail]/All和Mail.

python v3.4.1

中有效
import imaplib
import email
m = imaplib.IMAP4_SSL("imap.gmail.com", 993)
m.login("myemail@gmail.com","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()

最新更新