【问题标题】:Is is possible to search gmail via imap for multiple X-GM-THRIDs in one request?是否可以通过 imap 在一个请求中搜索 gmail 以获得多个 X-GM-THRID?
【发布时间】:2013-12-09 23:16:54
【问题描述】:

我有许多 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 究竟是什么或如何限制搜索长度 - 我认为这可能是字符数,而不是查询中的“或”数。在gmail开始返回错误之前,我可以逃脱大约9。

【问题讨论】:

  • 如果我在一个线程中有超过 10 条消息,我将如何产生结果,我使用我的代码您可以检索 Thread_ID 中存在的 UID。 10个或超过10个
  • 上面的代码检索三个给定线程的所有消息ID(线程中有多少消息没有区别)。例如,当我需要检索 20 个线程的 id 时,我会像上面一样进行 3 个查询(2*9 线程 id,1*2 线程 id),然后使用一个 fetch 命令从返回的 id 中获取消息。

标签: python gmail imap


【解决方案1】:

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

【讨论】:

  • 此解决方案有效,谢谢。但是,Gmail 最近似乎对您可以在查询中使用的“OR”数量施加了 10 个限制,这很糟糕:(
【解决方案2】:

我可以使用以下代码集从线程 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。

【讨论】:

  • 这非常慢,如果你想让它们都获取“1:*”,并获取 uid 和 x-gm-thrid。这会在一个请求中为您提供一对 uid 和线程 id,而不是 n 个请求。
  • 是的,很抱歉这段代码可能有效,但我一直在寻找一种方法来一次检索多个以避免多个请求。
  • @max and lee 如果你能用“code-sn-p”举个例子,我会更容易理解+帮助新人解决问题+提高问题+答案的质量。
  • @arshpreet,用我目前如何编写 IMAP 查询来解决问题更新了我的问题。
  • 我认为可以从一个线程中获取超过 10 条消息,但我会在编写可运行代码后更新我的答案。他们正在这样做,goo.gl/pRIRzu
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 2012-12-17
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
相关资源
最近更新 更多