【问题标题】:imap search for messages from users on whitelist?imap 搜索来自白名单用户的消息?
【发布时间】:2011-09-19 22:52:07
【问题描述】:

是否可以对来自白名单用户的消息进行 imap 搜索?我已经找到了几种适用于两个名称的变体,但我不知道如何概括它。已经尝试阅读 RFC3501 并在谷歌上搜索示例。我正在使用 python 的 imaplib 和 gmail,但我相信这并不重要,因为我的问题是弄清楚搜索字符串的语法。

m = imap(...)
m.search(None, '(OR (FROM "andy@gmail.com") (FROM "beth@gmail.com"))') # works

whitelist = ['andy@gmail.com', 'beth@gmail.com']
searchstring = '(OR ' + ' '.join(['(FROM "' + x + '")' for x in whitelist]) + ')'
m.search(None, searchstring) # works, but doesn't generalize.

【问题讨论】:

  • 为什么不概括?你有错误吗?出乎意料的结果?没有结果?
  • 有了这种变体,白名单中的后一个名称似乎是 ANDed 而不是 OR ed。我只有两个用户,没有超过两个。

标签: python search imap


【解决方案1】:

通过一些本地测试,我发现搜索中的 OR 是成对工作的。因此,当您仅搜索两个地址时,一切都会按预期进行。但是,在您需要第三个的那一刻,您需要执行以下操作:

'(OR (FROM "andy@gmail.com") (OR (FROM "beth@gmail.com") (FROM "chad@gmail.com")))'

我发现间距很重要。如果我使用这个类似的字符串(最后的右括号之间有空格),它会抛出一个错误:

'(OR (FROM "andy@gmail.com") (OR (FROM "beth@gmail.com") (FROM "chad@gmail.com") ) )'

这让我想起了我的 LISP 日子......无论如何,在列表上使用以下逻辑应该可以解决问题:

def buildOr(list):
    "Builds a tree structure like (OR (FROM 'term') (OR (FROM 'term') (FROM 'term')))"
    if len(list) < 2:
        raise RuntimeError('buildOr requires a list of at least 2')
    if len(list) == 2:
        return '(OR (FROM "{0}") (FROM "{1}"))'.format(list[0], list[1]) 
    else:
        return '(OR (FROM "{0}") {1})'.format(list[0], buildOr(list[1:]))

然后您可以将其与您的白名单结合起来进行如下搜索:

m.search(None, buildOr(whitelist))

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2019-03-01
    • 2015-06-09
    • 2013-05-24
    • 2010-10-26
    • 2018-11-02
    相关资源
    最近更新 更多