В результате локального тестирования я обнаружил, что ИЛИ в поиске работает парами.Поэтому при поиске только по двум адресам все работает как положено.В ту минуту, когда вам нужна третья, вам нужно сделать следующее:
'(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))