2016-06-27 2 views
0

Indy 10의 약간 오래된 설명서에는 TIdImap4 클래스의 SendCmd 함수에 대한 AExpectedResponses 매개 변수에 속한 것이 설명되어 있지 않습니다. 그러나 TIdImap4의 소스 코드를 통해 SendCmd가 내부적으로 사용되고 Google에서 검색되는 방법을 확인한 후에도 IMAP RFC의 응답 및/또는 결과 섹션의 항목을 언제 포함 할 것인지 및/또는 해당 매개 변수를 비워 두십시오. 아무도이 매개 변수가 사용되는 방법을 조금 설명 할 수 있고 그것에 있어야합니까?tidimap4.SendCmd에 대한 AExpectedResponses 매개 변수의 정의는 무엇입니까?

또는, 아마, 그것은 구체적인 예를 사용하는 것이 도움이 될 것이다 : 그래서 지금까지 내가 가지고 ...

내가 서버에 대한 UID MOVE를 구현하고 RFC 것을 지원합니다

IMAP.SendCmd('UID MOVE '+uidList.CommaText +' '+destFolder,[],true); 

그리고에서 RFC (6851)을 읽고 예상되는 응답 ("아무것도 없음")과 결과 (OK, NO, BAD)에 대한 힌트가 있습니다.

3.1. MOVE Command 
    Arguments: sequence set 
       mailbox name 
    Responses: no specific responses for this command 
    Result: OK - move completed 
      NO - move error: can't move those messages or to that name 
      BAD - command unknown or arguments invalid 

하지만 메모가 확인하기 전에이 명령에 나중에 관련 태그가없는 "무관"응답이있을 수도있다 :

Note that the server may send unrelated EXPUNGE responses as well, if 
any happen to have been expunged at the same time; this is normal 
IMAP operation. 

그리고 RFC는의 예를 제공합니다

C: a UID MOVE 42:69 foo 
    S: * OK [COPYUID 432432 42:69 1202:1229] 
    S: * 22 EXPUNGE 
    S: (more expunges) 
    S: a OK Done 

Gmail에 연결하는 것이 실제로 보이는 것과 동일하지는 않지만 기본적으로는 태그가없는 OK와 태그가없는 EXISTS 명령을 추가하는 것입니다. lieve)는 UIDPLUS 확장 지원을 지원하기 위해 포함됩니다 :

Sent 6/25/2016 4:08:04 PM: C246 UID MOVE 179,180,181,183,184,198,199 [Gmail]/Trash<EOL> 
Recv 6/25/2016 4:08:04 PM: * 48 EXPUNGE<EOL> 
Recv 6/25/2016 4:08:04 PM: * 48 EXPUNGE<EOL> 
Recv 6/25/2016 4:08:04 PM: * 48 EXPUNGE<EOL> 
Recv 6/25/2016 4:08:04 PM: * 49 EXPUNGE<EOL> 
Recv 6/25/2016 4:08:04 PM: * 49 EXPUNGE<EOL> 
Recv 6/25/2016 4:08:04 PM: * 54 EXPUNGE<EOL> 
Recv 6/25/2016 4:08:04 PM: * 54 EXPUNGE<EOL> 
Recv 6/25/2016 4:08:04 PM: * 53 EXISTS<EOL> 
Recv 6/25/2016 4:08:04 PM: C246 OK [COPYUID 2 179:181,183:184,198:199 80,79,78,77,76,75,74] (Success)<EOL> 

을 그래서 여기에 내가 "EXPUNGE"의 태그가 지정되지 않은 반응을보고하고 OK ""EXISTS "분명히"OK "결과 전에뿐만 아니라 전송 될 수있어 ".

그래서 실제로 AExpectedResponses에 속한 것이 [EXPUNGE, EXISTS, OK]인지, [[OK, NO, BAD]] 또는 그 밖의 모든 결과인지 알기 어렵습니다. 고맙습니다.

답변

1

응답의 줄을 구문 분석 할 때 AExpectedResponses 목록의 단어로 시작하지 않는 줄은 응답의 일부로 취급되지 않습니다 (물론 줄이 명령과 동일한 태그로 시작하지 않는 한, 그 이후로 응답을 종료합니다). 이 행은 저장되는 경우 LastCmdResult.Text 속성 대신 TIdReplyIMAP4(LastCmdResult).Extra 속성에 저장됩니다. 당신의 UID MOVE 예 응답에서

:

당신이 다음 (받은 경우) * OK [COPYUID 432432 42:69 1202:1229] 라인이 LastCmdResult.Text 속성에 저장됩니다 AExpectedResponses 목록에 'OK' 포함하는 경우, 그렇지 않으면 대신 TIdReplyIMAP4(LastCmdResult).Extra 속성에 저장됩니다.

그렇지 않으면 그들이 대신 TIdReplyIMAP4(LastCmdResult).Extra 속성에 저장됩니다 다음 * <msgid> EXPUNGE 라인 (받은 경우) LastCmdResult.Text 속성에 저장됩니다 AExpectedResponses 목록에서 'EXPUNGE'를 포함합니다.

그렇지 않으면 그들이 대신 TIdReplyIMAP4(LastCmdResult).Extra 속성에 저장됩니다 다음 * <msgid> EXISTS 라인 (받은 경우) LastCmdResult.Text 속성에 저장됩니다 AExpectedResponses 목록에서 'EXISTS'를 포함합니다.

기본적으로 AExpectedResponses에 지정하는 내용은 TIdReplyIMAP4.Text에 저장되며 나머지는 버려지거나 TIdReplyIMAP4.Extra에 저장됩니다.

적어도 단순한 설명입니다. TIdIMAP4은 IMAP이 실제로 비동기 프로토콜이기 때문에 매우 복잡한 구성 요소이지만 TIdIMAP4은 동기 구성 요소이므로 응답 파서는 예기치 않은 원치 않는 응답이 도착할 때 여러 가지 규칙을 사용하여 사례를 처리합니다. 그들을 버리십시오. 따라서 Extra 속성 (실제로는 내부적으로 수행하지 않는 TIdIMAP4)에주의를 기울여야합니다. 아마도 Indy 11에서 TIdIMAP4은 별도의 스레드 또는 이벤트 기반 모델에 대한 응답 처리를 분리하도록 재 설계 될 예정이지만 Indy 10에서는 발생하지 않을 가능성이 있습니다.

관련 문제