imap在白名单中搜索来自用户的消息?

时间:2011-09-19 22:52:08

标签: python search imap

是否可以对白名单中的用户运行imap搜索?我已经找到了几个与两个名称一起使用的变体,但我无法弄清楚如何概括它。已经尝试过阅读RFC3501和google搜索示例。我正在使用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.

1 个答案:

答案 0 :(得分:0)

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

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

我发现间距很重要。如果我使用这个类似的字符串(在最后的关闭parens之间有空格),则会抛出错误:

'(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))