Имап искать сообщения от пользователей в белом списке? - PullRequest
1 голос
/ 20 сентября 2011

Можно ли запустить поиск изображений от пользователей в белом списке? Я выяснил несколько вариантов, которые работают с двумя именами, но я не могу понять, как это обобщить. Уже пробовал читать 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.

1 Ответ

0 голосов
/ 11 декабря 2012

В результате локального тестирования я обнаружил, что ИЛИ в поиске работает парами.Поэтому при поиске только по двум адресам все работает как положено.В ту минуту, когда вам нужна третья, вам нужно сделать следующее:

'(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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...