2011-09-26 9 views
3

나는 pop3 및 imap 클라이언트를 파이썬에서 다양한 서버의 전자 메일 헤더 (및 전체 전자 메일 본문)를 다운로드하여 사용할 수있는 libs를 사용하여 작성하려고합니다. mongodb 데이터베이스. 내가 직면하고있는 문제는이 클라이언트가 사용자의 일반 전자 메일 클라이언트 외에도 전자 메일을 다운로드한다는 것입니다. 따라서 메일 클라이언트를 사용하여 다운로드 할 때 사용자가 서버에 이메일을 남기지 않을 수도 있다는 전제하에 헤더를 가져오고 특정 날짜부터 만 수집하므로 전체 메일 박스를 가져올 때마다 전체 메일 박스를 차지하지 않습니다. 헤더.특정 날짜 (파이썬)에서 POP3 헤더 다운로드

지금까지 POP3 목록 호출을 통해 서버에있는 모든 메시지를받을 수 있습니다. 심지어 이미 다운로드 한 메시지도 포함되어 있습니다. IMAP에는이 문제가 없습니다.

POP3 서버를 처리 할 때 전자 메일 클라이언트가이 상황을 어떻게 처리합니까?

답변

3

Outlook은 POP3 서버에 로그인하여 STAT, LISTUIDL 명령을 실행합니다. 사용자가 새로운 메시지를 가지고 있지 않다고 결정하면 로그 아웃합니다. 클라이언트와 내 DBMail POP3 서버 사이의 네트워크 트래픽을 추적 할 때 Outlook에서이 작업을 수행하는 것을 관찰했습니다. Outlook에서이 방법을 사용하여 POP3 서버에서 새 메시지를 검색하지 못했습니다. Thunderbird도 비슷하게 동작하지만 새 메시지를 감지하지 못합니다.

로그인 후 서버에 LISTUIDL 명령을 실행하십시오. LIST은 색인 번호 (메일 함의 메일의 선형 위치)와 각 메시지의 크기를 제공합니다. UIDL은 각 메시지에 대해 동일한 색인 번호와 계산 된 해시 값을 제공합니다.

각 사용자에 대해 LISTUIDL의 크기와 해시 값을 저장할 수 있습니다. 크기와 해시 값이 같으면 동일한 메시지라고 가정합니다. 주어진 메시지가이 목록에 더 이상 나타나지 않으면 삭제 된 것으로 간주하여 로컬 메모리에서 지우십시오.

완전한 순도를 얻으려면 메시지 목록에서 크기/해시 쌍의 상대 위치를 기억하여 반복 할 가능성을 지원할 수 있습니다. (Outlook의 새 메시지 검색 오류에 대한 내 생각에 이러한 값은 적어도 DBMail에서는 반복되지만 Outlook에서는 삭제 한 후에도이를 기억하므로 영원히 새로운 메시지가 아닌 것으로 간주합니다. 동작).

각주 : 헤더는 메시지의 일부임을 기억하십시오. 이러한 이유 때문에 머리글에서 아무 것도 신뢰하지 마십시오. 날짜, 보낸 사람, 심지어 서버 핸드 오프 정보조차도 쉽게 위조 될 수 있으며 고유 한 것으로 간주 될 수 없습니다.

+0

고마워요! 이것은 내가 바라는대로 완전하고 화려한 대답이다. – Harel