2016-06-27 26 views
0

Die etwas veraltete Dokumentation für Indy 10 erklärt nicht, was in den Parameter AExpectedResponses für die SendCmd-Funktion in der TIdImap4-Klasse gehört. Aber selbst nachdem ich den Quellcode von TIdImap4 durchgesehen habe, um zu sehen, wie SendCmd intern verwendet wird und nach Google sucht, bekomme ich kein konsistentes Bild darüber, wann Elemente aus den Antworten und/oder Ergebnisbereichen der IMAP-RFCs und/oder eingeschlossen werden Lassen Sie diesen Parameter leer. Kann mir jemand erklären, wie dieser Parameter benutzt wird und was drin sein soll?Was gehört in den Parameter AEpectedResponses zu tidimap4.SendCmd?

Oder vielleicht würde es helfen, ein konkretes Beispiel zu verwenden:

I UID MOVE für Server bin die Umsetzung, die die RFC unterstützen ... so so weit ich habe:

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

Und aus Lesen Sie die RFC (6851), gibt es einige Hinweise zu den erwarteten Antworten ("nichts Spezifisches") und Ergebnis (OK, NEIN, SCHLECHT).

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 

aber es gibt auch eine Notiz später, dass es unmarkiert sein kann „unabhängige“ Antworten in Bezug auf diesen Befehl vor dem 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. 

Und der RFC gibt ein Beispiel eines solchen:

Es scheint ziemlich, aber nicht genau das gleiche wie das, was ich wirklich sehe Verbindung zu Google Mail, die im Grunde ist das gleiche mit keinen unmarkierten OK, und die Zugabe von einem unmarkierten EXISTS-Befehl (was ich sein lieve enthält, um die UIDPLUS Erweiterung Unterstützung) zu unterstützen:

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> 

so hier ich sehe nicht markierte Antworten von „EXPUNGE“ und „exists“ und scheinbar „OK“ könnte auch gesendet werden, bevor die resultierenden „OK ".

Also ich bin ein wenig unscharf darüber, ob das, was eigentlich in ErwarteteResponsen gehört, [EXPUNGE, EXISTS, OK], nichts [], die Ergebnisse [OK, NO, BAD] oder etwas ganz anderes ist. Vielen Dank.

Antwort

1

Beim Analysieren der Zeilen einer Antwort wird jede Zeile, die nicht mit einem Wort in der -Liste beginnt, nicht als Teil der Antwort behandelt (es sei denn, die Zeile beginnt mit demselben Tag wie der Befehl). weil das die Antwort beendet). Die Zeile wird in der TIdReplyIMAP4(LastCmdResult).Extra-Eigenschaft statt der LastCmdResult.Text-Eigenschaft gespeichert, wenn sie überhaupt gespeichert wird.

In Ihrer UID MOVE Beispiel Antwort:

Wenn Sie 'OK' in der AExpectedResponses Liste schließen dann die * OK [COPYUID 432432 42:69 1202:1229] Linie (falls erhalten) in der LastCmdResult.Text Eigenschaft gespeichert werden, sonst wird es stattdessen in der TIdReplyIMAP4(LastCmdResult).Extra Eigenschaft gespeichert werden.

Wenn Sie umfassen 'EXPUNGE' in der AExpectedResponses Liste dann die * <msgid> EXPUNGE Zeilen (falls erhalten) in der LastCmdResult.Text Eigenschaft gespeichert werden, sonst werden sie stattdessen in der TIdReplyIMAP4(LastCmdResult).Extra Eigenschaft gespeichert werden.

Wenn Sie umfassen 'EXISTS' in der AExpectedResponses Liste dann die * <msgid> EXISTS Zeilen (falls erhalten) in der LastCmdResult.Text Eigenschaft gespeichert werden, sonst werden sie stattdessen in der TIdReplyIMAP4(LastCmdResult).Extra Eigenschaft gespeichert werden.

Grundsätzlich wird alles, was Sie in AExpectedResponses angeben, in TIdReplyIMAP4.Text gespeichert, und alles andere wird entweder verworfen oder unter TIdReplyIMAP4.Extra gespeichert.

Oder zumindest ist das eine vereinfachte Erklärung. TIdIMAP4 ist eine sehr komplexe Komponente, vor allem weil IMAP eigentlich ein asynchrones Protokoll ist, aber TIdIMAP4 ist eine synchrone Komponente, so verwendet seine Antwort Parser mehrere Regeln, um Fälle zu behandeln, wenn unerwartete unerwünschte Antworten ankommen, wenn nicht erwartet, und es nicht will verwerfe sie. Sie müssen also auf die Extra Eigenschaft achten (die TIdIMAP4 nicht wirklich intern tut, obwohl es wahrscheinlich sollte). Vielleicht in Indy 11, TIdIMAP4 wird neu gestaltet werden, um Antwortbehandlung zu einem separaten Thread oder einem ereignisbasierten Modell zu trennen, aber das wird wahrscheinlich nicht in Indy 10 passieren.