Gmail标签显示为顶级邮箱,而不是相反。要搜索多个邮箱,您需要执行多个查询,从而select()
在适当的邮箱上执行然后执行search
命令(或uid
在您的情况下)。
配置您的 gmail 帐户以通过 IMAP 访问聊天:
您提供的链接:使用 Imaplib 在 Python 中访问聊天文件夹仍然非常重要,因为用户需要允许 IMAP 访问他们的聊天日志。您还可以查看Gmail 使用的 imap 扩展X-GM-RAW
,以及 和的描述X-GM-LABELS
。
如果您将 Gmail 用于企业,我不确定它是否有效(我没有要验证的帐户),但此链接:https ://developers.google.com/gmail/imap_extensions#checking_for_the_presence_of_extensions可能会帮助您查看如果存在扩展。
修改后的 utf-7 编码:
大多数 imap 服务器将邮箱名称和标签存储在utf-7
. 除非您使用的是 plain ,否则您不能使用像 gmail 这样的直接标签us-ascii
。IMAPClient
知道如何使用大多数 IMAP 服务器使用的修改后的 utf7 编码进行编码/解码。有一个针对 imaplib 的错误打开,因此您可能希望使用imapclient.imap_utf7
模块对邮箱名称和/或标签进行编码,直到开始自行imaplib
支持修改后的编码。utf-7
我在网上找到的另一件事:虽然您可能能够STORE
使用特定编码成功标记,但除非您使用经过修改的编码,否则您会惨遭失败SEARCH
(同样在涉及 xoauth时)utf-7
编码或指示字符集。其他项目已经为 gmail 完成了大部分工作,例如带有 imap-utf7 支持的BaGoMa(备份 google 邮件)。到目前为止,我已经能够通过带有latin-1
字符的 UI 创建一个标签,并SEARCH
使用utf-8
字符集为它创建一个标签。
以下是如何对标签进行编码:
from imapclient import imap_utf7
label = imap_utf7.encode(u'yourlabel')
另请参阅此问题:Python 的 IMAP 文件夹路径编码 (IMAP UTF-7)
您可以使用以下方法检查标签:
>>>> sock.select("[Gmail]/Chats", True)
>>>> sock.uid('FETCH', '1:*', 'X-GM-LABELS')
这对于检查您拥有的标签和调试编码问题很有用。
例子:
import imaplib
import getpass
import atexit
from imapclient import imap_utf7
def find_messages(sock, label):
mailbox = imap_utf7.encode(label)
label = imap_utf7.encode(label.encode('utf-8'))
try:
# process regular mailbox
sock.select(mailbox)
except sock.error:
pass
else:
resp, data = sock.uid('SEARCH', None, '(ALL)')
assert resp == 'OK'
for uid in data[0].split():
# because we do select, this uid will be valid.
yield uid
try:
# now process chats with that label
sock.select("[Gmail]/Chats", True)
except sock.error:
# access to chats via IMAP is disabled most likely
pass
else:
# resp, data = sock.uid('SEARCH', 'X-GM-RAW', 'label:%s' % label)
sock.literal = label
resp, data = sock.uid('SEARCH', 'CHARSET', 'UTF-8', 'X-GM-LABELS')
assert resp == 'OK'
for uid in data[0].split():
# because we do select, this uid will be valid.
yield uid
def test():
email = "XXXXXXXX@gmail.com"
label = u"français" # oui oui merci beaucoup.
sock = imaplib.IMAP4_SSL("imap.gmail.com", 993)
sock.login(email, getpass.getpass())
for uid in find_messages(sock, label):
# e.g.
print sock.uid('FETCH', uid, '(BODY[HEADER])')
sock.close()
sock.logout()
在我的机器上测试过!
>>> test()
Password:
('OK', [('1 (UID 14 BODY[HEADER] {398}', 'MIME-Version: 1.0\r\nReceived: by 10.XXX.XXX.XXX with HTTP; Thu, 11 Jul 2013 09:54:32 -0700 (PDT)\r\nDate: Thu, 11 Jul 2013 09:54:32 -0700\r\nDelivered-To: XXXXXXXX@gmail.com\r\nMessage-ID: <XXXXXXXX@mail.gmail.com>\r\nSubject: test email\r\nFrom: Damien <XXXXXXXX@gmail.com>\r\nTo: Damien <XXXXXXXX@gmail.com>\r\nContent-Type: text/plain; charset=ISO-8859-1\r\n\r\n'), ')'])
('OK', [('1 (UID 1 BODY[HEADER] {47}', 'From: Damien XXXXXXXX <XXXXXXXX@gmail.com>\r\n\r\n'), ')'])
('OK', [('2 (UID 2 BODY[HEADER] {46}', 'From: Vincent XXXXXXXX <XXXXXXXX@gmail.com>\r\n\r\n'), ')'])
未记录的接口:
imaplib
能够使用文字,这在使用不同的编码时特别有用。这可以通过IMAP4.literal
在运行命令之前设置属性来实现。
sock.literal = label
resp, data = sock.uid('SEARCH', 'CHARSET', 'UTF-8', 'X-GM-LABELS')