无法从收件箱以外的任何文件夹中检索 gmail 邮件(Python3 问题)
Posted
技术标签:
【中文标题】无法从收件箱以外的任何文件夹中检索 gmail 邮件(Python3 问题)【英文标题】:Unable to retrieve gmail messages from any folder other than inbox (Python3 issue) 【发布时间】:2014-09-30 22:10:17 【问题描述】:更新:我的代码在 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 - What is the correct folder name for Archive/All Mail in Gmail?
I cannot search sent emails in Gmail with Python
这是一个完整的示例程序,不适用于 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()
【问题讨论】:
奇怪的是,这在 Python3 下不起作用。 【参考方案1】:正如this answer中提到的:
尝试使用 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()
【讨论】:
非常感谢!此更改也适用于其他文件夹,例如“[Gmail]/Sent Mail”。以上是关于无法从收件箱以外的任何文件夹中检索 gmail 邮件(Python3 问题)的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 JavaMail 读取 Outlook 邮件,而 Gmail 可以工作
是啥导致我的“test.txt”文件从 Python 发送到我的 gmail 帐户时,当我在我的电子邮件收件箱中收到它时,它会显示为“无标题”?