문제

IMAP 서버에서 이메일을 가져온 다음 데이터베이스에 저장하는 클라이언트 응용 프로그램을 작성하고 있습니다. 문제는 일단 메일을 확인한 후 다음에 도착한 메일 만 다운로드하고 싶다는 것입니다. 따라서 2 시간 전에 서버를 메일을 확인한 경우 지난 2 시간 동안 도착한 메일 만 받고 싶습니다.

날짜 이후로 검색을 사용할 수는 있지만 시간 + 날짜에 대한 지원은 없습니다.

나는 또한 최근 깃발을 시도했지만 Gmail과 함께 작동하지 않는 것 같습니다 (Ruby에서는 매번 NIL을 보여줍니다).

도움이 되었습니까?

해결책

메시지에 고유 한 (UID)를 사용하려고합니다. 이것이 구체적으로 그것이 만들어진 이유입니다.

마지막 UID를 추적 한 다음 메시지 세트 [uid] :*"를 사용하는 모든 새 메시지를 요청하려면 [UID]가 실제 UID 값입니다.

예를 들어, 마지막 메시지 Feteched에 "123456"의 고유 한 ID가 있다고 가정 해 봅시다. 당신은 가져올 것입니다

123456:*

그런 다음 첫 번째 반환 된 메시지를 버립니다.

UID는 세션에 걸쳐 안정되어 있고 결코 변하지 않으며 항상 가치가 높아집니다. 이를 확인하는 캐치는 폴더를 선택할 때 uidvalidity를 확인하는 것입니다. UIDValidity 번호가 변경되지 않은 경우 UID는 여전히 세션에서 유효합니다.

RFC의 관련 부분은 다음과 같습니다.

2.3.1.1. 고유 식별자 (UID) 메시지 속성

고유 식별자 유효성 값 (아래 참조)과 함께 사용될 때 각 메시지에 할당 된 32 비트 값은 사서함의 다른 메시지 나 동일한 이름의 후속 사서함을 참조해서는 안되는 64 비트 값을 형성합니다. 고유 식별자는 사서함에서 엄격하게 오름차순으로 할당됩니다. 각 메시지가 사서함에 추가되면 이전에 추가 된 메시지보다 높은 UID가 할당됩니다. 메시지 시퀀스 번호와 달리 고유 식별자가 반드시 인접하지는 않습니다.

메시지의 고유 식별자는 세션 중에 변경되지 않아야하며 세션간에 변경되지 않아야합니다. 세션 간의 고유 식별자의 변경은 아래에 설명 된 UIDValidity 메커니즘을 사용하여 감지 할 수 있어야합니다. 클라이언트가 서버와의 이전 세션에서 상태를 다시 동기화하려면 영구적 인 고유 식별자가 필요합니다 (예 : 단절된 또는 오프라인 액세스 클라이언트). 이것은 [imap-disc]에서 더 자세히 설명합니다.

참고 : 다음 고유 식별자 값은 클라이언트 가이 값을 확인한 이후로 메시지가 사서함에 전달되었는지 여부를 결정할 수있는 수단을 제공하기위한 것입니다.

다음은 추가 정보가 포함 된 링크입니다.

http://www.faqs.org/rfcs/rfc3501.html

내가 할 일은 또한 다운로드 된 메시지의 internaldate를 추적하는 것입니다. 이런 식으로 UID 동기화를 잃어버린 경우 메시지를 통해 최소한 메시지를 반복하고 메시지의 Internaldate를 기반으로 마지막으로 다운로드 한 마지막 제품을 찾을 수 있습니다.

다른 팁

"Seen"이라는 IMAP 플래그가 있습니다. 대부분의 클라이언트는 메시지를 볼 때 보이는 메시지를 표시하므로 해당 플래그 세트가없는 서버의 메시지를 반복해야합니다.

다음은 올바른 아이디어를 제공하는 코드 스 니펫입니다. 물론 작동 비트는입니다

imap.search(["NOT", "SEEN"]).each do bla.bla.bla

수신 메일을 서버 측의 특정 IMAP 폴더로 필터링 할 수있는 경우 앱이 해당 폴더의 새 메시지를 읽은 다음 완료 한 후 표준받은 편지함 폴더로 이동할 수 있습니다.

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