![](/img/trans.png)
[英]How do I perform an IMAP search in Python (using Gmail and imaplib)?
[英]How do I include chats in a Gmail IMAP search from Python's imaplib?
我很高興使用imaplib來獲取特定標簽中的消息ID:
connection.select("MyLabel")
connection.uid('SEARCH', None, 'ALL'))
但如果我在那個標簽上有一些聊天,它們就不會被退回,所以它們對IMAP是不可見的。 我已經閱讀了使用Imaplib在Python中訪問聊天文件夾 ,雖然這是用於在Chats標簽中搜索,而不是在另一個標簽中找到聊天,並且它似乎不能使這個案例起作用。
我可以在“聊天”中對標記為“MyLabel”的消息執行第二次搜索,但這是一個額外的查詢,並要求我的應用程序的用戶進行相當多的設置。
Gmail 標簽公開為頂級郵箱 ,而不是相反。 要搜索多個郵箱,您需要執行多個查詢,從而在相應的郵箱上執行select()
,然后執行search
命令(或者在您的情況下使用uid
)。
您提供的鏈接: 在Python中訪問聊天文件夾使用Imaplib仍然非常相關,因為用戶需要允許IMAP訪問他們的聊天記錄。 您還可以查看Gmail使用的imap擴展程序 ,以及X-GM-RAW
和X-GM-LABELS
。
如果您使用Gmail進行商務營銷,我不確定它是否有效(我沒有要驗證的帳戶),但是這個鏈接: https : //developers.google.com/gmail/imap_extensions#checking_for_the_presence_of_extensions可能會幫助您查看如果存在擴展名。
大多數imap服務器在修改后的utf-7
版本中存儲郵箱名稱和標簽。 除非你使用普通的us-ascii
否則你不能在gmail中使用這樣的直接標簽。 IMAPClient
知道如何使用大多數IMAP服務器使用的修改后的utf7編碼進行編碼/解碼。 有一個針對imaplib的錯誤,因此您可能需要使用imapclient.imap_utf7
模塊對郵箱名稱和/或標簽進行編碼,直到imaplib
開始支持修改后的utf-7
編碼為止。 我在網上找到的其他東西:雖然你可能能夠使用特定的編碼成功STORE
標簽,但是你很難為它們SEARCH
(當涉及到xoauth時),除非你使用修改后的utf-7
編碼或指示字符集。 其他項目已經完成了gmail的大部分工作,例如支持imap-utf7的BaGoMa( 備份谷歌郵件 )。 到目前為止,我已經能夠通過UI使用latin-1
字符創建標簽,並使用utf-8
字符集為其創建SEARCH
。
以下是如何對標簽進行編碼:
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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.