Python에서 IMAP 검색을 어떻게 수행합니까(Gmail 및 imaplib 사용)?

StackOverflow https://stackoverflow.com/questions/179026

  •  05-07-2019
  •  | 
  •  

문제

Gmail에는 라벨이 지정된 메일이 많이 있습니다.

IMAP 클라이언트를 사용하여 해당 메시지를 받고 싶지만 검색 주문이 무엇인지 잘 모르겠습니다.

c = imaplib.IMAP4_SSL('imap.gmail.com')
c.list()
('OK', [..., '(\\HasNoChildren) "/" "GM"', ...])
c.search(???)

이런 종류의 예를 많이 찾지 못했습니다.

도움이 되었습니까?

해결책

imaplib 의도적으로 IMAP 프로토콜을 둘러싼 얇은 래퍼이므로 사용자에게 더 큰 유연성과 IMAP 사양의 변경 사항에 적응할 수 있는 더 큰 능력을 허용한다고 가정합니다.결과적으로 검색어에 대한 구조를 실제로 제공하지 않으며 사용자가 IMAP 사양.

섹션 "6.4.4.SEARCH 명령"에는 검색 기준으로 지정할 수 있는 항목이 많이 있습니다.하셔야 한다는 점 참고하세요 SELECT 무엇이든 검색하기 전에 사서함(폴더에 대한 IMAP 이름).(여러 폴더를 동시에 검색하려면 여러 IMAP 연결이 필요하다고 알고 있습니다.) IMAP4.list 사서함 식별자가 무엇인지 파악하는 데 도움이 됩니다.

전달하는 문자열을 공식화하는 데에도 유용합니다. imaplib "9입니다.위에 링크된 RFC의 형식 구문'을 참조하세요.

그만큼 r'(\HasNoChildren) "/"' 루트 사서함의 사서함 플래그입니다. /.“7.2.6.플래그 응답".

행운을 빌어요!

다른 팁

import imaplib 
obj = imaplib.IMAP4_SSL('imap.gmail.com', 993)
obj.login('username', 'password')
obj.select('**label name**') # <-- the label in which u want to search message
obj.search(None, 'FROM', '"LDJ"')

Gmail과 함께 Imaplib을 사용하는 가장 쉬운 방법은 X-GM-RAW 속성에 설명 된대로 Gmail IMAP 확장 페이지.

프로세스는 다음과 같습니다.

먼저 적절한 이메일 및 비밀번호로 계정에 연결하십시오.

c = imaplib.IMAP4_SSL('imap.gmail.com', 993)
email = 'eggs@spam'
password = 'spamspamspam'
c.login(email, password)

그런 다음 폴더/레이블 중 하나에 연결하십시오.

c.select("INBOX")

필요한 경우 사용 가능한 모든 폴더/레이블을 c.list().

마지막으로 검색 방법을 사용하십시오.

gmail_search = "has:attachment eggs OR spam"
status, data = c.search(None, 'X-GM-RAW', gmail_search)

에서 gmail_search 사용 된 것과 동일한 검색 구문을 사용할 수 있습니다 Gmail 고급 검색.

검색 명령은 명령의 상태와 gmail_search와 일치하는 모든 메시지의 ID를 반환합니다.

이 후에는 다음과 같이 각 메시지를 가져올 수 있습니다.

for id in data[0].split():
    status, data = gmail.fetch(id, '(BODY[TEXT])')

나는 Imaplib이 많은 응답 파싱을하지 않는다는 것에 놀랐습니다. 그리고 응답은 구문 분석하기 어려운 것으로 보인다.

fwiw, 내 자신의 질문에 답하기 위해 : c.search (없음, 'gm')

( '( hasnochildren) "/"'부분이 무엇인지 모르겠습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top