Python imaplib:fetch命令,带或不带括号,' Invalid Fetch属性#39;所有项目的错误

时间:2015-01-05 13:31:08

标签: python imap fetch imaplib imapclient

我正在尝试从我的IMAP服务器获取邮件。这是我的代码的简短版本:

>>> import imaplib
>>> m = imaplib.IMAP4_SSL(host='my.host.com')
>>> m.login('username', 'password')
>>> m.select('INBOX')

python3.4中的imaplib模块与RFC 2060标准兼容。 它说:

  

FETCH命令检索与邮箱中的邮件关联的数据。要获取的数据项可以是单个原子或带括号的列表。

现在我得到了一些不同的结果,我无法理解:

>>> m.fetch('1613', '(ALL)')
imaplib.error: FETCH command error: BAD [b'Invalid Fetch attribute ALL']

>>> m.fetch('1613', 'ALL')
('OK', [b'1613 (FLAGS (\\Seen) INTERNALDATE' ... etc ...

>>> m.fetch('1613', '(FLAGS)')
('OK', [b'1613 (FLAGS (\\Seen))'])

>>> m.fetch('1613', 'FLAGS')
('OK', [b'1613 (FLAGS (\\Seen))'])

>>> m.fetch('1613', '(FLAGS ENVELOPE)')
('OK', ... etc ...

>>> m.fetch('1613', '(FLAGS ALL)')
imaplib.error: FETCH command error: BAD [b'Invalid Fetch attribute ALL']

有人可以向我解释为什么我不能在括号中使用ALL项目吗?

我问的原因是因为我使用的是IMAPClient模块,它会自动将括号添加到参数中,因此ALL项目无法正常工作。

1 个答案:

答案 0 :(得分:2)

ALL不是一个获取项目,它是一个宏。语法中有点特殊情况。还有另外两个,FAST和FULL。它们就像获取物品,但有一些额外的限制,其中一个是你遇到的。

我建议您只使用等效的获取项目,您将获得所需的结果,而无需处理特殊限制。来自RFC3501:

  ALL
     Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE)

  FAST
     Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE)

  FULL
     Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODY)