是否可以通过imap在一个请求中搜索多个X-GM-THRID的gmail?

时间:2013-12-09 23:16:54

标签: python gmail imap

我有很多X-GM-THRID,我想要检索这些线程的uid列表。

https://developers.google.com/gmail/imap_extensions描述了如何为单个X-GM-THRID找到这些。但是,如果我可以为我想要数据的所有X-GM-THRID做出一个请求,那就太好了。当我尝试这个时,我只得到错误代码。

有人知道这是否可行?

我正在使用python并做类似的事情:

res, ids = imap_conn.uid('search', 'X-GM-THRID', thread_id)
# this works fine.

但我想做点什么:

res, ids = imap_conn.uid('search', 'X-GM-THRID', [thread_id1, thread_id2])

更新:

在@max的答案之后,我现在正在做这样的事情:

res, ids = imap_conn.uid(
    'search', None, 
    '(OR (OR (X-GM-THRID 123) X-GM-THRID 456) X-GM-THRID 789)')
# 123, 456, 789 are fake gmail thread ids

我不确定gmail究竟是什么或如何限制搜索长度 - 我认为它可能是字符数而不是查询中“OR”的数量。在gmail开始返回错误之前,我可以逃脱大约9个。

2 个答案:

答案 0 :(得分:2)

您需要添加“或”限定符,然后构建扩展搜索查询。有关搜索格式,请参阅RFC 3501。

答案 1 :(得分:-1)

我可以使用以下代码集从线程ID获取UID。

from imaplib import IMAP4_SSL

mail = IMAP4_SSL('imap.gmail.com')


mail.login(<Email>,<password>)

mail.select('INBOX')

result, uid = mail.uid('search',None,"ALL") # Get all the UIDs

uid_list = []

for uids in uid[0].split():
    uid_list.append(uids)

    for p in uids_list:

        result, data = mail.uid('fetch', p, '(X-GM-THRID)')    

        q = data[0].split() #splitting all thread IDs into list.

        m = q[2]    

        res, ids = mail.uid('search', 'X-GM-THRID', m)

        w = ids[0].split()

        print w  # printing UIDs related to Thread-IDs

首先,我从收件箱中获取所有UID并使用这些UID我正在搜索Thread-ID并使用这些Thread-ID我再次获得与特定Thread-ID相关的UID。