12 IMAPCommands
: array[1..25] of string =
13 ({ Client Commands - Any State}
17 { Client Commands - Non Authenticated State}
20 { Client Commands - Authenticated State}
32 { Client Commands - Selected State}
41 { Client Commands - Experimental/ Expansion}
45 TCommandEvent
= procedure(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
46 var Handled
: Boolean) of object;
48 TIdIMAP4Server
= object(TIdTCPServer
)
50 fOnCommandCAPABILITY
: TCommandEvent
;
51 fONCommandNOOP
: TCommandEvent
;
52 fONCommandLOGOUT
: TCommandEvent
;
53 fONCommandAUTHENTICATE
: TCommandEvent
;
54 fONCommandLOGIN
: TCommandEvent
;
55 fONCommandSELECT
: TCommandEvent
;
56 fONCommandEXAMINE
: TCommandEvent
;
57 fONCommandCREATE
: TCommandEvent
;
58 fONCommandDELETE
: TCommandEvent
;
59 fONCommandRENAME
: TCommandEvent
;
60 fONCommandSUBSCRIBE
: TCommandEvent
;
61 fONCommandUNSUBSCRIBE
: TCommandEvent
;
62 fONCommandLIST
: TCommandEvent
;
63 fONCommandLSUB
: TCommandEvent
;
64 fONCommandSTATUS
: TCommandEvent
;
65 fONCommandAPPEND
: TCommandEvent
;
66 fONCommandCHECK
: TCommandEvent
;
67 fONCommandCLOSE
: TCommandEvent
;
68 fONCommandEXPUNGE
: TCommandEvent
;
69 fONCommandSEARCH
: TCommandEvent
;
70 fONCommandFETCH
: TCommandEvent
;
71 fONCommandSTORE
: TCommandEvent
;
72 fONCommandCOPY
: TCommandEvent
;
73 fONCommandUID
: TCommandEvent
;
74 fONCommandX
: TCommandEvent
;
75 fOnCommandError
: TCommandEvent
;
76 procedure DoCommandCAPABILITY(Thread
: TIdPeerThread
; const Tag
, CmdStr
:
77 string; var Handled
: Boolean);
78 procedure DoCommandNOOP(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string; var
80 procedure DoCommandLOGOUT(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
81 var Handled
: Boolean);
82 procedure DoCommandAUTHENTICATE(Thread
: TIdPeerThread
; const Tag
, CmdStr
:
83 string; var Handled
: Boolean);
84 procedure DoCommandLOGIN(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
85 var Handled
: Boolean);
86 procedure DoCommandSELECT(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
87 var Handled
: Boolean);
88 procedure DoCommandEXAMINE(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
89 var Handled
: Boolean);
90 procedure DoCommandCREATE(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
91 var Handled
: Boolean);
92 procedure DoCommandDELETE(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
93 var Handled
: Boolean);
94 procedure DoCommandRENAME(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
95 var Handled
: Boolean);
96 procedure DoCommandSUBSCRIBE(Thread
: TIdPeerThread
; const Tag
, CmdStr
:
97 string; var Handled
: Boolean);
98 procedure DoCommandUNSUBSCRIBE(Thread
: TIdPeerThread
; const Tag
, CmdStr
:
99 string; var Handled
: Boolean);
100 procedure DoCommandLIST(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string; var
102 procedure DoCommandLSUB(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string; var
104 procedure DoCommandSTATUS(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
105 var Handled
: Boolean);
106 procedure DoCommandAPPEND(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
107 var Handled
: Boolean);
108 procedure DoCommandCHECK(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
109 var Handled
: Boolean);
110 procedure DoCommandCLOSE(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
111 var Handled
: Boolean);
112 procedure DoCommandEXPUNGE(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
113 var Handled
: Boolean);
114 procedure DoCommandSEARCH(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
115 var Handled
: Boolean);
116 procedure DoCommandFETCH(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
117 var Handled
: Boolean);
118 procedure DoCommandSTORE(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
119 var Handled
: Boolean);
120 procedure DoCommandCOPY(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string; var
122 procedure DoCommandUID(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string; var
124 procedure DoCommandX(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string; var
126 procedure DoCommandError(Thread
: TIdPeerThread
; const Tag
, CmdStr
: string;
127 var Handled
: Boolean);
128 function DoExecute(Thread
: TIdPeerThread
): Boolean; override;
130 // constructor Create(AOwner: TComponent); override;
132 property ONCommandCAPABILITY
: TCommandEvent read fOnCommandCAPABILITY write
133 fOnCommandCAPABILITY
;
134 property ONCommandNOOP
: TCommandEvent read fONCommandNOOP write
136 property ONCommandLOGOUT
: TCommandEvent read fONCommandLOGOUT write
138 property ONCommandAUTHENTICATE
: TCommandEvent read fONCommandAUTHENTICATE
139 write fONCommandAUTHENTICATE
;
140 property ONCommandLOGIN
: TCommandEvent read fONCommandLOGIN write
142 property ONCommandSELECT
: TCommandEvent read fONCommandSELECT write
144 property OnCommandEXAMINE
: TCommandEvent read fOnCommandEXAMINE write
146 property ONCommandCREATE
: TCommandEvent read fONCommandCREATE write
148 property ONCommandDELETE
: TCommandEvent read fONCommandDELETE write
150 property OnCommandRENAME
: TCommandEvent read fOnCommandRENAME write
152 property ONCommandSUBSCRIBE
: TCommandEvent read fONCommandSUBSCRIBE write
154 property ONCommandUNSUBSCRIBE
: TCommandEvent read fONCommandUNSUBSCRIBE write
155 fONCommandUNSUBSCRIBE
;
156 property ONCommandLIST
: TCommandEvent read fONCommandLIST write
158 property OnCommandLSUB
: TCommandEvent read fOnCommandLSUB write
160 property ONCommandSTATUS
: TCommandEvent read fONCommandSTATUS write
162 property OnCommandAPPEND
: TCommandEvent read fOnCommandAPPEND write
164 property ONCommandCHECK
: TCommandEvent read fONCommandCHECK write
166 property OnCommandCLOSE
: TCommandEvent read fOnCommandCLOSE write
168 property ONCommandEXPUNGE
: TCommandEvent read fONCommandEXPUNGE write
170 property OnCommandSEARCH
: TCommandEvent read fOnCommandSEARCH write
172 property ONCommandFETCH
: TCommandEvent read fONCommandFETCH write
174 property OnCommandSTORE
: TCommandEvent read fOnCommandSTORE write
176 property OnCommandCOPY
: TCommandEvent read fOnCommandCOPY write
178 property ONCommandUID
: TCommandEvent read fONCommandUID write fONCommandUID
;
179 property OnCommandX
: TCommandEvent read fOnCommandX write fOnCommandX
;
180 property OnCommandError
: TCommandEvent read fOnCommandError write
182 property DefaultPort default IdPORT_IMAP4
;
185 PIdIMAP4Server
=^TIdIMAP4Server
;
186 // constructor Create(AOwner: TComponent); override;
187 function NewIdIMAP4Server(AOwner
:PControl
):PIdIMAP4Server
;
223 { constructor TIdIMAP4Server.Create(AOwner: TComponent);
226 function NewIdIMAP4Server(AOwner
:PControl
):PIdIMAP4Server
;
229 New( Result
, Create
);
231 DefaultPort
:= IdPORT_IMAP4
;
234 function TIdIMAP4Server
.DoExecute(Thread
: TIdPeerThread
): Boolean;
243 function GetFirstTokenDeleteFromArg(var s1
: string;
244 const sDelim
: string): string;
248 nPos
:= IndyPos(sDelim
, s1
);
251 nPos
:= Length(s1
) + 1;
253 Result
:= Copy(s1
, 1, nPos
- 1);
260 while Thread
.Connection
.Connected
do
263 RcvdStr
:= Thread
.Connection
.ReadLn
;
265 sTag
:= UpperCase(GetFirstTokenDeleteFromArg(ArgStr
, CHAR32
));
266 sCmd
:= UpperCase(GetFirstTokenDeleteFromArg(ArgStr
, CHAR32
));
267 CmdNum
:= Succ(PosInStrArray(Uppercase(sCmd
), IMAPCommands
));
269 cCAPABILITY
: DoCommandCAPABILITY(Thread
, sTag
, ArgStr
, Handled
);
270 cNOOP
: DoCommandNOOP(Thread
, sTag
, ArgStr
, Handled
);
271 cLOGOUT
: DoCommandLOGOUT(Thread
, sTag
, ArgStr
, Handled
);
272 cAUTHENTICATE
: DoCommandAUTHENTICATE(Thread
, sTag
, ArgStr
, Handled
);
273 cLOGIN
: DoCommandLOGIN(Thread
, sTag
, ArgStr
, Handled
);
274 cSELECT
: DoCommandSELECT(Thread
, sTag
, ArgStr
, Handled
);
275 cEXAMINE
: DoCommandEXAMINE(Thread
, sTag
, ArgStr
, Handled
);
276 cCREATE
: DoCommandCREATE(Thread
, sTag
, ArgStr
, Handled
);
277 cDELETE
: DoCommandDELETE(Thread
, sTag
, ArgStr
, Handled
);
278 cRENAME
: DoCommandRENAME(Thread
, sTag
, ArgStr
, Handled
);
279 cSUBSCRIBE
: DoCommandSUBSCRIBE(Thread
, sTag
, ArgStr
, Handled
);
280 cUNSUBSCRIBE
: DoCommandUNSUBSCRIBE(Thread
, sTag
, ArgStr
, Handled
);
281 cLIST
: DoCommandLIST(Thread
, sTag
, ArgStr
, Handled
);
282 cLSUB
: DoCommandLSUB(Thread
, sTag
, ArgStr
, Handled
);
283 cSTATUS
: DoCommandSTATUS(Thread
, sTag
, ArgStr
, Handled
);
284 cAPPEND
: DoCommandAPPEND(Thread
, sTag
, ArgStr
, Handled
);
285 cCHECK
: DoCommandCHECK(Thread
, sTag
, ArgStr
, Handled
);
286 cCLOSE
: DoCommandCLOSE(Thread
, sTag
, ArgStr
, Handled
);
287 cEXPUNGE
: DoCommandEXPUNGE(Thread
, sTag
, ArgStr
, Handled
);
288 cSEARCH
: DoCommandSEARCH(Thread
, sTag
, ArgStr
, Handled
);
289 cFETCH
: DoCommandFETCH(Thread
, sTag
, ArgStr
, Handled
);
290 cSTORE
: DoCommandSTORE(Thread
, sTag
, ArgStr
, Handled
);
291 cCOPY
: DoCommandCOPY(Thread
, sTag
, ArgStr
, Handled
);
292 cUID
: DoCommandUID(Thread
, sTag
, ArgStr
, Handled
);
295 if (Length(SCmd
) > 0) and (UpCase(SCmd
[1]) = 'X') then
297 DoCommandX(Thread
, sTag
, ArgStr
, Handled
);
301 DoCommandError(Thread
, sTag
, ArgStr
, Handled
);
308 procedure TIdIMAP4Server
.DoCommandCapability(Thread
: TIdPeerThread
; const Tag
,
310 var Handled
: Boolean);
312 if Assigned(fOnCommandCAPABILITY
) then
314 OnCommandCAPABILITY(Thread
, Tag
, CmdStr
, Handled
);
318 procedure TIdIMAP4Server
.DoCommandNOOP(Thread
: TIdPeerThread
;
319 const Tag
, CmdStr
: string; var Handled
: Boolean);
321 if Assigned(fONCommandNOOP
) then
323 OnCommandNOOP(Thread
, Tag
, CmdStr
, Handled
);
327 procedure TIdIMAP4Server
.DoCommandLOGOUT(Thread
: TIdPeerThread
;
328 const Tag
, CmdStr
: string; var Handled
: Boolean);
330 if Assigned(fONCommandLOGOUT
) then
332 OnCommandLOGOUT(Thread
, Tag
, CmdStr
, Handled
);
336 procedure TIdIMAP4Server
.DoCommandAUTHENTICATE(Thread
: TIdPeerThread
;
337 const Tag
, CmdStr
: string; var Handled
: Boolean);
339 if Assigned(fONCommandAUTHENTICATE
) then
341 OnCommandAUTHENTICATE(Thread
, Tag
, CmdStr
, Handled
);
345 procedure TIdIMAP4Server
.DoCommandLOGIN(Thread
: TIdPeerThread
;
346 const Tag
, CmdStr
: string; var Handled
: Boolean);
348 if Assigned(fONCommandLOGIN
) then
350 OnCommandLOGIN(Thread
, Tag
, CmdStr
, Handled
);
354 procedure TIdIMAP4Server
.DoCommandSELECT(Thread
: TIdPeerThread
;
355 const Tag
, CmdStr
: string; var Handled
: Boolean);
357 if Assigned(fONCommandSELECT
) then
359 OnCommandSELECT(Thread
, Tag
, CmdStr
, Handled
);
363 procedure TIdIMAP4Server
.DoCommandEXAMINE(Thread
: TIdPeerThread
;
364 const Tag
, CmdStr
: string; var Handled
: Boolean);
366 if Assigned(fONCommandEXAMINE
) then
368 OnCommandEXAMINE(Thread
, Tag
, CmdStr
, Handled
);
372 procedure TIdIMAP4Server
.DoCommandCREATE(Thread
: TIdPeerThread
;
373 const Tag
, CmdStr
: string; var Handled
: Boolean);
375 if Assigned(fONCommandCREATE
) then
377 OnCommandCREATE(Thread
, Tag
, CmdStr
, Handled
);
381 procedure TIdIMAP4Server
.DoCommandDELETE(Thread
: TIdPeerThread
;
382 const Tag
, CmdStr
: string; var Handled
: Boolean);
384 if Assigned(fONCommandDELETE
) then
386 OnCommandDELETE(Thread
, Tag
, CmdStr
, Handled
);
390 procedure TIdIMAP4Server
.DoCommandRENAME(Thread
: TIdPeerThread
;
391 const Tag
, CmdStr
: string; var Handled
: Boolean);
393 if Assigned(fONCommandRENAME
) then
395 OnCommandRENAME(Thread
, Tag
, CmdStr
, Handled
);
399 procedure TIdIMAP4Server
.DoCommandSUBSCRIBE(Thread
: TIdPeerThread
;
400 const Tag
, CmdStr
: string; var Handled
: Boolean);
402 if Assigned(fONCommandSUBSCRIBE
) then
404 OnCommandSUBSCRIBE(Thread
, Tag
, CmdStr
, Handled
);
408 procedure TIdIMAP4Server
.DoCommandUNSUBSCRIBE(Thread
: TIdPeerThread
;
409 const Tag
, CmdStr
: string; var Handled
: Boolean);
411 if Assigned(fONCommandUNSUBSCRIBE
) then
413 OnCommandUNSUBSCRIBE(Thread
, Tag
, CmdStr
, Handled
);
417 procedure TIdIMAP4Server
.DoCommandLIST(Thread
: TIdPeerThread
;
418 const Tag
, CmdStr
: string; var Handled
: Boolean);
420 if Assigned(fONCommandLIST
) then
422 OnCommandLIST(Thread
, Tag
, CmdStr
, Handled
);
426 procedure TIdIMAP4Server
.DoCommandLSUB(Thread
: TIdPeerThread
;
427 const Tag
, CmdStr
: string; var Handled
: Boolean);
429 if Assigned(fONCommandLSUB
) then
431 OnCommandLSUB(Thread
, Tag
, CmdStr
, Handled
);
435 procedure TIdIMAP4Server
.DoCommandSTATUS(Thread
: TIdPeerThread
;
436 const Tag
, CmdStr
: string; var Handled
: Boolean);
438 if Assigned(fONCommandSTATUS
) then
440 OnCommandSTATUS(Thread
, Tag
, CmdStr
, Handled
);
444 procedure TIdIMAP4Server
.DoCommandAPPEND(Thread
: TIdPeerThread
;
445 const Tag
, CmdStr
: string; var Handled
: Boolean);
447 if Assigned(fONCommandAPPEND
) then
449 OnCommandAPPEND(Thread
, Tag
, CmdStr
, Handled
);
453 procedure TIdIMAP4Server
.DoCommandCHECK(Thread
: TIdPeerThread
;
454 const Tag
, CmdStr
: string; var Handled
: Boolean);
456 if Assigned(fONCommandCHECK
) then
458 OnCommandCHECK(Thread
, Tag
, CmdStr
, Handled
);
462 procedure TIdIMAP4Server
.DoCommandCLOSE(Thread
: TIdPeerThread
;
463 const Tag
, CmdStr
: string; var Handled
: Boolean);
465 if Assigned(fONCommandCLOSE
) then
467 OnCommandCLOSE(Thread
, Tag
, CmdStr
, Handled
);
471 procedure TIdIMAP4Server
.DoCommandEXPUNGE(Thread
: TIdPeerThread
;
472 const Tag
, CmdStr
: string; var Handled
: Boolean);
474 if Assigned(fONCommandEXPUNGE
) then
476 OnCommandEXPUNGE(Thread
, Tag
, CmdStr
, Handled
);
480 procedure TIdIMAP4Server
.DoCommandSEARCH(Thread
: TIdPeerThread
;
481 const Tag
, CmdStr
: string; var Handled
: Boolean);
483 if Assigned(fONCommandSEARCH
) then
485 OnCommandSEARCH(Thread
, Tag
, CmdStr
, Handled
);
489 procedure TIdIMAP4Server
.DoCommandFETCH(Thread
: TIdPeerThread
;
490 const Tag
, CmdStr
: string; var Handled
: Boolean);
492 if Assigned(fONCommandFETCH
) then
494 OnCommandFETCH(Thread
, Tag
, CmdStr
, Handled
);
498 procedure TIdIMAP4Server
.DoCommandSTORE(Thread
: TIdPeerThread
;
499 const Tag
, CmdStr
: string; var Handled
: Boolean);
501 if Assigned(fONCommandSTORE
) then
503 OnCommandSTORE(Thread
, Tag
, CmdStr
, Handled
);
507 procedure TIdIMAP4Server
.DoCommandCOPY(Thread
: TIdPeerThread
;
508 const Tag
, CmdStr
: string; var Handled
: Boolean);
510 if Assigned(fONCommandCOPY
) then
512 OnCommandCOPY(Thread
, Tag
, CmdStr
, Handled
);
516 procedure TIdIMAP4Server
.DoCommandUID(Thread
: TIdPeerThread
; const Tag
, CmdStr
:
518 var Handled
: Boolean);
520 if Assigned(fONCommandUID
) then
522 OnCommandUID(Thread
, Tag
, CmdStr
, Handled
);
526 procedure TIdIMAP4Server
.DoCommandX(Thread
: TIdPeerThread
; const Tag
, CmdStr
:
528 var Handled
: Boolean);
530 if Assigned(fONCommandX
) then
532 OnCommandX(Thread
, Tag
, CmdStr
, Handled
);
536 procedure TIdIMAP4Server
.DoCommandError(Thread
: TIdPeerThread
; const Tag
,
538 var Handled
: Boolean);
540 if Assigned(fONCommandError
) then
542 OnCommandError(Thread
, Tag
, CmdStr
, Handled
);