2012-05-21 4 views
1

imap 계정 (예 : [email protected])이 있으며 메시지를 연결하여 대상에 다시 복제 할 수있는 많은 라이브러리를 알고 있습니다. 나는 다음과 같은IMAP 메시지 동기화 (복제)

  1. 처음을 달성하고자, 나는 (전송 폴더를 포함하여) 모든 메시지를 다운로드하려면, 내가 처음 다운로드 할 때, 나는 어떤 데이터베이스에 로컬 ID 및 UID에 메시지를 저장합니다.
  2. 두 번째로 읽은/읽지 않은 상태 또는 플래그 또는 삭제 된 플래그가 변경되었거나 삭제 된 경우에도 다운로드 한 메시지를 쿼리하고 싶지 않습니다.
  3. Google의 목표는 모든 메시지를 한 번만 로컬로 다운로드하고 동기화하는 것입니다.

이제 IMAP 메시지에 대해 ID, UID 및 MessageID라는 것이 있다는 것을 거의 알지 못합니다. ID는 현재 폴더의 오프셋 일 가능성이 높으며 UID는 현재 계정의 숫자 ID이며 MessageID는 고유 한 문자열입니다.

이제는 폴더를 쿼리하는 동안 어떤 검색을 사용해야하며, 한 번 다운로드 한 메시지는 나에게 반환되지 않을 것입니다.

http://mailsystem.codeplex.com/ 라이브러리를 사용할 계획이며 사용자 지정 문자열로 검색 할 수 있고 int 배열을 반환합니다.

나는 MaxID가 있다고 가정하고, ID 나 UID가 MaxID보다 큰 메시지 만 다운로드하려고한다. 어느 것을 사용해야합니까? UID 또는 ID?

답변

3

UID는 UIDVALIDITY와 함께 사용해야합니다. 두 값은 폴더마다 다릅니다.

IMAP 클라이언트가 동기화를 수행하는 방법을 설명하는 정보 RFC가 있습니다 (RFC-4549, 섹션 4.3). 텍스트는 다음과 같은 두 가지 명령을 실행하는 것이 좋습니다 : 첫 번째 명령은 (얼마나 많은 메일을 모른 채) 알 수없는 모든 메일에 대한 필요한 정보를 가져 오는 데 사용됩니다

tag1 UID FETCH <lastseenuid+1>:* <descriptors> 
tag2 UID FETCH 1:<lastseenuid> FLAGS 

. 두 번째 명령은 이미 본 메일의 플래그를 동기화하는 데 사용됩니다.

AFAIK이 방법은 널리 사용됩니다. 따라서 많은 IMAP 서버에는이 정보를 빠르게 제공하기위한 최적화가 포함되어 있습니다. 일반적으로 네트워크 대역폭이 제한 요소입니다.

+0

폴더에받은 최대 UID가 1000 및 100 인 두 개의 폴더,받은 편지함 및 스팸이 있다고 가정합니다. 이제 두 동기화 시간 사이에 UID 101이 포함 된 메시지가 스팸으로 수신되고 사용자가 메시지를받은 편지함으로 이동하면 UID는 어떻게됩니까? 이 메시지는 1001로 새로운 UID를 얻나요? –

+0

IMAP은 이동 작업을 지원하지 않고 전자 메일을 대상 폴더에 복사하고 원본 폴더에서 제거해야합니다. UID는 폴더 내에서 고유하며 전자 메일이 폴더에 추가되거나 복사 될 때 전자 메일은이 폴더 내에서 사용 된 모든 이전 UID보다 큰 UID를 가져옵니다. – nosid

+0

또한 검색 이후에 대해 알았습니다. 매일 동기화하는 것이 더 좋을까요? 서버 트립을 최소화하고 싶습니다. 왜 UIDVALIDITY를 신경 써야합니까? –

관련 문제