2016-06-27 3 views
0

Indy 10の若干古くなったドキュメントでは、TIdImap4クラスのSendCmd関数のAExpectedResponsesパラメータに含まれる内容については説明していません。しかし、TIdImap4のソースコードを見て、SendCmdが内部的にどのように使われているのか、そしてGoogleで検索してみた後でも、IMAP RFCの回答や結果セクションの項目をいつ含めるべきか、そして/またはそのパラメーターはブランクのままにします。誰もが、このパラメータがどのように使われているのか、それに何が入っているのか少し説明できますか?tidimap4.SendCmdにAExpectedResponsesパラメータがどのように属していますか?

または、おそらく、それは具体的な例を使用するために役立つだろう:

私はRFCは...そう、これまで私が持っていることをサポートするサーバーのUID MOVE実装しています:

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 

が、ノートがOKする前に、このコマンドに、後に関連したタグなしの「無関係」の応答があるかもしれないこともあります:

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に接続しているのと全く同じではないようですが、これは基本的にはタグなしのものと同じですが、タグなしの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> 

ので、ここで私はOK、」結果の前に「OK」、同様に送信される可能性が明らかに「EXPUNGE」のタグなしの応答を見て、「EXISTS」としています"

実際に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プロパティに保存されます。

あなたはAExpectedResponsesリストに'EXPUNGE'が含まれている場合、その後* <msgid> EXPUNGEライン(受信の場合は)そうでない場合は、代わりにTIdReplyIMAP4(LastCmdResult).Extraプロパティに保存されます、LastCmdResult.Textプロパティに保存されます。

あなたはAExpectedResponsesリストに'EXISTS'が含まれている場合、その後* <msgid> EXISTSライン(受信の場合は)そうでない場合は、代わりにTIdReplyIMAP4(LastCmdResult).Extraプロパティに保存されます、LastCmdResult.Textプロパティに保存されます。

AExpectedResponsesで指定した内容は、基本的にはTIdReplyIMAP4.Textに保存され、他のものは破棄されるか、TIdReplyIMAP4.Extraに保存されます。

少なくとも、これは簡単な説明です。 TIdIMAP4は非常に複雑なコンポーネントです。主にIMAPは実際には非同期プロトコルですが、TIdIMAP4は同期コンポーネントなので、応答パーザは予期しないときに予期しない迷惑応答が到着した場合に対応するためにいくつかのルールを使用します。それらを捨てなさい。したがって、Extraのプロパティ(TIdIMAP4は実際には内部的には実行されませんが、おそらくそうであるはずです)に注意する必要があります。おそらくIndy 11では、TIdIMAP4は、個別のスレッドまたはイベントベースのモデルに対する応答処理を分離するように再設計されますが、Indy 10では起こりそうにありません。

関連する問題