2013-08-31 6 views
13

웹 인터페이스, Google의 Android 클라이언트 또는 IMAP를 사용하여 Gmail에 액세스 할 수 있습니다. 내가 말할 수있는 한, 웹 인터페이스와 안드로이드 애플 리케이션은 IMAP과 완전히 다른 프로토콜을 사용한다. 그것들은 단지 그것 위에있는 인터페이스가 아니다. 내가 확신 할 수있는 이유는 안드로이드 애플 리케이션이 아무 문제없이3 초 안에 1m 메일 폴더를 열 수 있기 때문이다. 일반 IMAP 클라이언트는이를 수행 할 수 없습니다.Google은 Gmail에 어떤 프로토콜을 사용합니까? (IMAP 또는 POP가 아님)

제 질문은이 비밀 프로토콜에 대해 알려진 내용입니까? 그것에 대한 참조 문서는 어디에 있습니까? 리버스 엔지니어링 되었습니까? Google은 그 사용을인가합니까?

$ openssl s_client -host imap.gmail.com -port 993 -crlf 
... 
* OK Gimap ready for requests from 12.34.56.78 
$ a LOGIN ***@*** *** 
a OK 
$ c SELECT "[Gmail]/All mail" !!!! 
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen) 
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)] Flags permitted. 
* OK [UIDVALIDITY 673376278] UIDs valid. 
* 1142417 EXISTS 
* 0 RECENT 
* OK [UIDNEXT 1159771] Predicted next UID. 
* OK [HIGHESTMODSEQ 8670601] 
c OK [READ-WRITE] [Gmail]/All mail selected. (Success) 

내가 표시 한 명령, c SELECT "[Gmail]/All mail"은 완료하는 데 약 20초를 취합니다

ARNT의 대답은 Gmail의 원시 IMAP 속도를 테스트 할 수있는 훌륭한 방법을 제공합니다. 그 시간 이후로 필자의 상대적으로 낮은 성능의 안드로이드 폰의 GMail 앱을 시작하고 모든 메일 레이블을로드하는 데 걸리는 시간보다 큽니다. 모든 메일 레이블은 캐시를 삭제 한 후에도 6 초 이내에 수행됩니다. 웹 클라이언트는 훨씬 빠릅니다.

기본 사항이 누락 된 경우를 제외하고는 SELECT 명령을 완료하기 위해 20 초를 기다릴 필요가 없으므로 Google GMail 클라이언트가 IMAP을 사용하지 않는다는 것이 "합리적인 의의를 넘어서"는 것을 증명합니다.

+0

imap이 아닌가요? Imap은 폴더를 열기 위해 모든 이메일을 다운로드 할 필요가 없습니다. 따라서, 상위 10 개 전자 메일에 대한 정보를 다운로드하고 백그라운드에서 나머지 정보를 계속 다운로드 할 수 있습니다. –

+0

예. IMAP 성능은 거대한 사서함에서 저하됩니다. Gmail은 3 초 이내에 1 백만 개의 메일이 포함 된 메일함에 최신 스레드 50 개를 표시 할 수 있습니다. 다른 IMAP 클라이언트는이를 수행 할 수 없습니다. Gmail에는 non-imapness에 대한 더 많은 이야기가 있습니다.하지만이 질문에는 답이 없습니다. –

+0

나는 클라이언트를 분해하거나 컴퓨터에서 WiFi를 거쳐 목적지 포트가 무엇인지 확인하는 두 가지 옵션을 생각해 낸다. –

답변

5

는 더 많은 연구 후에, 나는 Gmail을위한 API가 존재하는 것으로 나타났습니다 : 나는 그 API를 사용하여 2013 년

다시이 질문을 게시 할 때 API가 출시 된 것을 생각하지 않는다 https://developers.google.com/gmail/api/를, 내가 만든 https://gist.github.com/bjourne/37a9d15b03862003008a1b0169190dbe

프로그램의 관련 부분은 다음과 같습니다 : 레이블의 100 개 마지막 메일을 가져 오는 데모 프로그램 IMAP 용어로

그것은 라벨에 날짜별로 정렬 지난 100 메시지를 나열
resource = service.users().messages() 
result = resource.list(userId = 'me', labelIds = [label]).execute() 
mail_ids = [m['id'] for m in result['messages']] 

start = time() 
mails = [] 
batch = BatchHttpRequest() 
cb = lambda req, res, exc: mails.append(to_mail(res)) 
for mail_id in mail_ids: 
    get_request = resource.get(**headers_params(mail_id)) 
    batch.add(get_request, callback = cb) 
result = batch.execute() 
print('Took %.2f seconds' % (time() - start)) 

(폴더) c 570,000 개가 넘는 메시지를받습니다.

내 컴퓨터에서이 루프는 약 0.5 - 0.8 초 걸립니다. 에 순수한 IMAP 클라이언트가 없다고 자신있게 주장 할 수 있습니다. 아마도 IMAP은 Google이 내부적으로 메일을 저장하는 방식에 적합하지 않기 때문에 더 빨라질 수 없습니다.

나는 내 자신의 질문에 답할 것입니다. 이것은 사용중인 API이며 이전에는 노출되지 않았습니다.

+1

실제로 시간이 걸리는 작업은 MSN 유지 관리입니다. 메시지에 액세스하면 Google 서버는 현재 사서함에있는 메시지 번호 569901임을 알립니다. 이것은 대부분의 IMAP 클라이언트가 삭제하는 정보입니다. – arnt

1

"다른 어떤 IMAP 클라이언트도이를 수행 할 수 없습니다."라는 말은 상당히 과감한 성명이지만 메시지 수는 꽤 큰 숫자입니다. Trojitá에 시도해 보시기 바랍니다. 처음 동기화가 다소 느릴 가능성이 있습니다 (IMAP 플래그, SELECT, SEARCHSTATUS이 지정되는 방식과 관련된 다양한 기술적 인 이유로 수백만 개의 메시지에 대한 플래그를 전송할 수 있지만 이후의 resynchronizaiton은 매우 빠름 ESEARCH, CONDSTOREQRESYNC. 나는 Trojitá가 당신의 설정과 얼마나 잘 작동하는지 듣고 싶습니다 - 연락처 정보는 홈페이지에 있습니다.

귀하의 질문에 - 대부분의 웹 메일은 요즘 개인용 API를 제공합니다. 전형적인 아키텍처는 JSON을 통해 업데이트 된 상태에 관한 메시지를 전송하는 것이지만, 이에 대한 표준은 없으며 인터페이스는 prioprietary입니다. GMail "앱"이 동일한 (또는 유사한) 방법을 사용할 가능성이 있습니다. TLS를 사용할 가능성이 있기 때문에이를 확인할 수있는 옵션이 많지 않습니다. 웹 인터페이스를 사용하면 적절한 브라우저 플러그인으로 트래픽을 볼 수는 있지만, 독립 실행 형 Android 애플리케이션에서는 그다지 많지 않습니다.

+0

제안 해 주셔서 감사합니다. Trojita는 어떤 방법으로도 속도가 느리지는 않지만 (실제로 다른 일부 고객과 비교하면 매우 좋음) 속도는 Gmail의 기본 클라이언트에 근접하지 않습니다. –

9

Android 앱 (적어도 사용한 적이있는 앱)은 IMAP을 사용합니다. 서버에서 Wireshark를 실행하여이를 확인할 수 있습니다.

왜 안드로이드 애플 리케이션이 매우 빠릅니다 - 내가 알고있는 것은 가장 최근의 메시지를 선택하기 위해 SEARCH 명령을 사용한다는 것입니다. 썬더 버드 나 아웃룩과 같은 데스크톱 클라이언트는 권장하지는 않지만 훨씬 더 무겁고 폴더의 모든 메시지에 대한 헤더와 메타 데이터를 다운로드합니다.

스마트 폰에는 수백만 개의 전자 메일을 저장하고 처리 할 수있는 리소스가 없으므로 (최신 기술의 전자 메일이있을 수도 있음) 검색 방법을 사용하면 휴대용 장치에 빠른 메일 액세스가 가능합니다.

아무튼 Wireshark는 IMAP 클라이언트와 서버의 동작에 대해 많은 것을 보여줄 수 있습니다. 당신이 정말로 호기심이 있다면, 기회를주십시오. 서버가 Gmail 인 경우에는이 작업을 수행 할 수 없지만 다른 서버 (예 : hMailServer)에서 시도 할 수는 있습니다.

+0

내가 말하는 Android 앱은 다음과 같습니다. https://play.google.com/store/apps/details?id=com.google.android.gm IMAP을 사용하는 것을 어떻게 알 수 있습니까? 또한 afaik, IMAP에는 가장 최근의 메시지 만 검색하도록 제한하는 방법이 없습니다. 다르게 알고있는 경우 참조를 제공해주십시오. 따라서 Gmail이 빠른 이유는 아닙니다. –

+0

내가 IMAP을 광범위하게 사용했기 때문에 내가 알기로, 서버에 연결하여 해당 서버에서 Wireshark를 실행하면 메시지가 통과되는 것을 볼 수 있습니다. 그리고 내가 말했듯이, SEARCH 명령을 사용하여 최근 메시지 세트를 얻을 수 있습니다.안드로이드 메일 클라이언트는 날짜 기억 조건과 함께 SEARCH를 사용하므로 지난 2 주간의 메일을받습니다. 다시 한번, 이것을 이해하는 가장 좋은 방법은 Wireshark에서 스스로를 보는 것입니다. – Gigi

+1

클라이언트가 EXISTS 메시지에주의를 기울이면 가장 최근의 n 개의 메시지를 검색 할 수 있습니다. 서버의 마지막 EXISTS가 50000이면 'x UID SEARCH 49000 : * SUBJECT sex'은 가장 최근 천분의성에 관한 메시지를 검색합니다. – arnt

1

Gmail의 IMAP 성능을 쉽게 테스트 할 수 있습니다 (백만 개의 메일 함이있는 경우).

openssl s_client -connect imap.gmail.com:993 -crlf 

으로 IMAP 연결을 열고 로그인하여받은 편지함을 엽니 다. (이름은 UI 언어에 따라 달라질 수 있습니다)

a login [email protected] yourpassword 
b select inbox 

또는받은 편지함이 충분히 크지 않은 경우 전체 편지 상자를 엽니 다 SELECT 빠른하지만 IMAP 클라이언트 느린

c select "[Gmail]/All Mail" 

경우 해당이 있기 때문입니다 클라이언트가 추가/불필요한 느린 명령을 보냅니다. 많은 사람들이 40 개의 메시지 만 표시 할지라도 전체 백만 개의 메시지에 대한 데이터 구조를 채우거나 업데이트하도록 선택합니다. IMAP의 속도 저하가 아니라 클라이언트 선택입니다.