2011-03-23 2 views
2

내 이해에 따라, 전체 읽지 않은 메일 수 또는 메일함에 관계없이 모든 최근 메일의 UID를 전체 IMAP 계정에 쿼리 할 수있는 방법은 없습니다. 계정에 대해 읽지 않은 총 카운트를 얻으려면 모든 mbox를 반복하고 상태를 확인해야합니다. 나는 그렇게했지만 아주 느리다. (많은 사서함이있는 나의 계정 중 하나에서 45 초).전체 계정에 대한 읽지 않은 메시지 수를 효율적으로 확인하십시오.

Mail.app는 깊게 중첩 된 사서함에서도 몇 초 안에 새 메시지를 찾을 수 있습니다.

여기서 속도는 Net :: IMAP을 사용하는 데 한계가 있습니까? 또는 최근 메시지가있는 사서함과 같이 제한된 사서함 집합을 반환하는 일부 기능이 누락 되었습니까?

응답 처리기를 사용하고 mboxes의 카운터가 1보다 큰 캐시를 유지 한 다음 각주기의 조합 만 확인하는 유일한 방법입니다. 그러나 스크립트에서이 작업을 수행하려고하므로 캐시가 필요하지 않으면 캐시를 넘을 필요가 없습니다.

+1

다른 모든 경우에, 당신은이 문제에 [와이어 샤크 (http://en.wikipedia.org/wiki/Wireshark)을 던지는 방법 와이어 Mail.app를 읽을 수 실패 그것이하는 일을합니다. – sarnold

+0

클라이언트가 폴더를 선택할 때까지 메시지는'\ Recent' 만 남기 때문에'RECENT'를 추적하는 것이 도움이되지 않을 것입니다. 데이터에 액세스하는 다른 IMAP 클라이언트가 있으면'RECENT'가 계속 재설정됩니다. – dkarp

답변

3

IMAP에서 새 메일을 검색하는 표준 방법은 UIDNEXT입니다. 당신이 걱정하는 각 폴더를

A001 STATUS "foldername" (UIDVALIDITY UIDNEXT) 

을 실행하면 당신에게 해당 폴더에 대한 예상 다음 UID를 제공 할 것입니다. Here's what the RFC has to say :

고유 식별자 가 사서함에 엄격하게 상승하는 방식으로 할당된다; 각 메시지가 사서함에 추가 될 때 이전에 추가 된 메시지보다 높은 UID가 할당됩니다. 메시지 시퀀스 숫자와 달리 고유 식별자는 연속적 일 필요가 없습니다.

다음 고유 식별자 값은 사서함의 새 메시지에 할당 된 이 될 예측 값입니다. 고유 한 식별자 유효성이 변경되지 않는 한 (다음 참조) 다음 고유 한 식별자 값은 다음 두 가지 특성을 가져야합니다. 먼저 새 메시지 이 사서함에 추가되지 않으면 다음 고유 식별자 값을 변경해서는 안됩니다. 둘째, 새 메시지가 사서함에 추가 될 때마다 값이 변경되어야합니다.

그래서 각 폴더의 예상 된 다음 UID 및 UID 유효성 값을 추적하십시오. STATUS 명령의 결과가 UIDNEXT 또는 UIDVALIDITY이 캐시 된 값에서 변경되면 새 메일 (이전 메일 인 경우) 또는 다시 동기화 (후자 인 경우)를 확인해야합니다.

Something like this :

imap.status("foldername", ["UIDNEXT", "UIDVALIDITY"]) 
+0

나는 뭔가를 놓치고 있다고 생각합니다. 각 사서함의 UID 중 하나를 추적하고 각 사서함에서 매번 변경 내용을 확인해야하는 경우이 방법으로 절약 할 대상은 무엇입니까?아무 것도 캐싱하지 않는 것보다 낫지 만, 리프레시마다 각 상자를 반복하면서 카운트를 반환하는 것보다 낫지 않습니까? UID 상태가 RECENT보다 훨씬 빨리 반환됩니까? – farski

+0

@farski :'STATUS'는 일반적으로'SELECT'보다 훨씬 빠릅니다 (그리고 거의 항상 느리지 않습니다). 그리고'RECENT'를 체크하는 것은 클라이언트가 폴더를 선택할 때까지 메시지가 단지'\ Recent' 상태를 유지하기 때문에 아마도 도움이되지 않을 것입니다. 데이터에 액세스하는 다른 IMAP 클라이언트가있는 경우 'RECENT'는 0으로 재설정됩니다. – dkarp

+0

죄송합니다. UNSEEN을 (를) 의미했습니다. 내가 이제까지 시도한 것은'상태'뿐이며 결코'선택'이 아닙니다. 루비 표준 라이브러리 인 net/imap을 통해 간단하게 연결하고 상자를 나열한 다음'STATUS'' COUNT'을 얻습니다. 내가하는 모든 것이 목록이라면 2 초가 걸릴 것입니다. 상태를 추가하면 약 50 초가 걸립니다. – farski

관련 문제