📄 pop3prot.pas
字号:
N1 := 0;
N2 := 0;
Exit;
end;
N2 := atoi(p);
Result := TRUE;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.SendCommand(Cmd : String);
begin
Display('> ' + Cmd);
Application.ProcessMessages;
FWSocket.SendStr(Cmd + #13 + #10);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TCustomPop3Cli.OkResponse : Boolean;
begin
Result := ((Length(FLastResponse) > 0) and (FLastResponse[1] = '+'));
if Result then
FStatusCode := 0
else
FStatusCode := 500;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Display(Msg : String);
begin
if Assigned(FOnDisplay) then
FOnDisplay(Self, Msg);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.ClearErrorMessage;
begin
FErrorMessage := '';
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.SetErrorMessage;
begin
if FErrorMessage = '' then
FErrorMessage := FLastResponse;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.CheckReady;
begin
if not (FState in [pop3Ready, pop3InternalReady]) then
raise pop3Exception.Create('POP3 component not ready');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.StateChange(NewState : TPop3State);
begin
if FState <> NewState then begin
FState := NewState;
TriggerStateChange;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.DisplayLastResponse;
begin
TriggerDisplay('< ' + FLastResponse);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.ExecAsync(
RqType : TPop3Request;
Cmd : String; { Command to execute }
NextState : TPop3ProtocolState; { Next protocol state in case of success }
DoneAsync : TPop3NextProc); { What to do when done }
begin
CheckReady;
if not FConnected then
raise Pop3Exception.Create('POP3 component not connected');
if not FHighLevelFlag then
FRequestType := RqType;
FRequestDoneFlag := FALSE;
FNext := NextExecAsync;
FNextProtocolState := NextState;
FDoneAsync := DoneAsync;
StateChange(pop3WaitingResponse);
SendCommand(Cmd);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.NextExecAsync;
begin
DisplayLastResponse;
if not OkResponse then begin
FRequestResult := FStatusCode;
SetErrorMessage;
TriggerRequestDone(FRequestResult);
Exit;
end;
FRequestResult := 0;
FProtocolState := FNextProtocolState;
if Assigned(FDoneAsync) then
FDoneAsync
else
TriggerRequestDone(FRequestResult);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.User;
begin
if FProtocolState > pop3WaitingUser then begin
FErrorMessage := '-ERR USER command invalid now';
Display(FErrorMessage);
raise Pop3Exception.Create(FErrorMessage);
end;
FFctPrv := pop3FctUser;
ExecAsync(pop3User, 'USER ' + Trim(FUserName), pop3WaitingPass, nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Connect;
begin
CheckReady;
if FConnected then
raise Pop3Exception.Create('POP3 component already connected');
if not FHighLevelFlag then
FRequestType := pop3Connect;
FRequestDoneFlag := FALSE;
FReceiveLen := 0;
FRequestResult := 0;
StateChange(pop3DnsLookup);
ClearErrorMessage;
FWSocket.OnDataSent := nil;
FWSocket.OnDnsLookupDone := WSocketDnsLookupDone;
FWSocket.DnsLookup(FHost);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Abort;
begin
StateChange(pop3Abort);
FWSocket.CancelDnsLookup;
FWSocket.Abort;
StateChange(pop3Ready);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Pass;
begin
if FProtocolState > pop3WaitingPass then begin
FErrorMessage := '-ERR PASS command invalid now';
Display(FErrorMessage);
raise Pop3Exception.Create(FErrorMessage);
end;
FFctPrv := pop3FctPass;
ExecAsync(pop3Pass, 'PASS ' + Trim(FPassWord), pop3Transaction, nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.RPop;
begin
if FProtocolState > pop3WaitingPass then begin
FErrorMessage := '-ERR RPOP command invalid now';
Display(FErrorMessage);
raise Pop3Exception.Create(FErrorMessage);
end;
FFctPrv := pop3FctRPop;
ExecAsync(pop3RPop, 'RPOP ' + Trim(FPassWord), pop3Transaction, nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.APop;
begin
if FProtocolState <> pop3WaitingUser then begin
FErrorMessage := '-ERR APOP command invalid now';
Display(FErrorMessage);
raise Pop3Exception.Create(FErrorMessage);
end;
if FTimeStamp = '' then begin
FErrorMessage := '-ERR Server do not support APOP (no timestamp)';
Display(FErrorMessage);
raise Pop3Exception.Create(FErrorMessage);
end;
FFctPrv := pop3FctAPop;
ExecAsync(pop3APop, 'APOP ' + Trim(FUserName) + ' ' +
LowerCase(StrMD5(FTimeStamp + FPassWord)),
pop3Transaction, nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Quit;
begin
CheckReady;
FFctPrv := pop3FctQuit;
if not FConnected then begin
{ We are not connected, it's ok... }
FRequestType := pop3Quit;
FRequestDoneFlag := FALSE;
TriggerRequestDone(0);
Exit;
end;
ExecAsync(pop3Quit, 'QUIT', pop3Disconnected, nil); { Should I force a FWSocket.Close }
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Stat;
begin
FFctPrv := pop3FctStat;
StartTransaction('STAT', '', pop3Stat, pop3Transaction, StatDone);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.StatDone;
begin
ExtractNumbers(FMsgCount, FMsgSize);
TriggerRequestDone(FRequestResult);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.List;
begin
FFctPrv := pop3FctList;
if FMsgNum <= 0 then
{ Scan LIST command (all messages) }
StartTransaction('LIST', '', pop3List, pop3Transaction, ListAllDone)
else
{ Single message LIST command }
StartTransaction('LIST', IntToStr(FMsgNum), pop3List,
pop3Transaction, ListSingleDone);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Uidl;
begin
FFctPrv := pop3FctUidl;
if FMsgNum <= 0 then
{ UIDL command (all messages) }
StartTransaction('UIDL', '', pop3Uidl, pop3Transaction, UidlAllDone)
else
{ Single message UIDL command }
StartTransaction('UIDL', IntToStr(FMsgNum), pop3Uidl,
pop3Transaction, UidlSingleDone);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.UidlAllDone;
begin
StartMultiLine(FOnUidlBegin, FOnUidlLine, FOnUidlEnd, ProcessUidl);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.UidlSingleDone;
begin
ExtractUidl(FMsgNum, FMsgUidl);
TriggerRequestDone(FRequestResult);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.ListSingleDone;
begin
ExtractNumbers(FMsgNum, FMsgSize);
TriggerRequestDone(FRequestResult);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.ListAllDone;
begin
StartMultiLine(FOnListBegin, FOnListLine, FOnListEnd, ProcessList);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Retr;
begin
FFctPrv := pop3FctRetr;
StartTransaction('RETR', IntToStr(FMsgNum),
pop3Retr, pop3Transaction, RetrDone);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Top;
begin
if FMsgLines < 0 then
raise Pop3Exception.Create('Invalid MsgLines for TOP command');
FFctPrv := pop3FctTop;
StartTransaction('TOP', IntToStr(FMsgNum) + ' ' + IntToStr(FMsgLines),
pop3Top, pop3Transaction, RetrDone);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.RetrDone;
begin
StartMultiLine(FOnMessageBegin, FOnMessageLine, FOnMessageEnd, nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Dele;
begin
FFctPrv := pop3FctDele;
StartTransaction('DELE', IntToStr(FMsgNum),
pop3Dele, pop3Transaction, nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Noop;
begin
FFctPrv := pop3FctNoop;
StartTransaction('NOOP', '', pop3Noop, pop3Transaction, nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.RSet;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -