2011-09-19 3 views
1

허용 목록에있는 사용자의 메시지에 대해 imap 검색을 실행할 수 있습니까? 두 가지 이름으로 작동하는 몇 가지 변형을 알아 냈지만 일반화하는 방법을 알 수는 없습니다. 이미 RFC3501을 읽고 인터넷 검색을 시도했습니다. 나는 파이썬의 imaplib과 gmail을 사용하고 있지만, 문제는 검색 문자열의 구문을 알아내는 것이므로 중요하지 않습니다.화이트리스트에있는 사용자의 메시지를 검색하는 imap을 원하십니까?

m = imap(...) 
m.search(None, '(OR (FROM "[email protected]") (FROM "[email protected]"))') # works 

whitelist = ['[email protected]', '[email protected]'] 
searchstring = '(OR ' + ' '.join(['(FROM "' + x + '")' for x in whitelist]) + ')' 
m.search(None, searchstring) # works, but doesn't generalize. 
+0

왜 일반화하지 않는 이유는 무엇입니까? 오류가 있습니까? 예기치 않은 결과가 있습니까? 결과가 없습니까? –

+0

이 변형을 사용하면 화이트리스트의 후자 이름이 OR ed 대신 AND 처리가 된 것처럼 보입니다. 두 명 이상의 사용자가있는 경우 조회수가 높고 두 명 이상인 경우는 없습니다. –

답변

0

일부 로컬 테스트를 통해 검색에서 OR이 쌍으로 작동한다는 것을 알았습니다. 따라서 두 주소 만 검색하면 모든 것이 예상대로 작동합니다. 그래도 3 분이 필요할 때 다음을 수행해야합니다.

'(OR (FROM "[email protected]") (OR (FROM "[email protected]") (FROM "[email protected]")))' 

나는 간격이 중요하다는 것을 알게되었습니다. 을해야 목록에 다음과 같은 논리를 사용하여, 어쨌든

'(OR (FROM "[email protected]") (OR (FROM "[email protected]") (FROM "[email protected]")))' 

이 내 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)) 
관련 문제