📄 pop3prot.pas
字号:
ExecAsync(pop3Auth, 'AUTH CRAM-SHA1',
pop3WaitingUser, AuthCramSha1);
{$ELSE}
raise Exception.Create('SHA1 require Delphi 5 or later');
{$ENDIF}
popAuthCramMD5 : ExecAsync(pop3Auth, 'AUTH CRAM-MD5',
pop3WaitingUser, AuthCramMD5);
else
User;
end;
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;
FTimeStamp := '';
ClearErrorMessage;
FWSocket.OnDataSent := nil;
FWSocket.OnDnsLookupDone := WSocketDnsLookupDone;
StateChange(pop3DnsLookup);
try
FWSocket.DnsLookup(FHost);
except
Abort;
raise;
end;
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 does not support APOP (no timestamp)'; {HLX ;PP}
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
FFctPrv := pop3FctRSet;
StartTransaction('RSET', '', pop3RSet, pop3Transaction, nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Last;
begin
FFctPrv := pop3FctLast;
StartTransaction('LAST', '', pop3Last, pop3Transaction, LastDone);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.LastDone;
begin
ExtractNumbers(FMsgNum, FMsgSize);
TriggerRequestDone(FRequestResult);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.Open;
begin
HighLevelAsync(pop3Open, [pop3FctConnect, pop3FctUser, pop3FctPass]);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.StartTransaction(
OpCode : String;
Params : String;
RqType : TPop3Request;
NextState : TPop3ProtocolState; { Next protocol state in case of success}
DoneTrans : TPop3NextProc); { What to do when done }
var
Cmd : String;
begin
if FProtocolState <> pop3Transaction then begin
FErrorMessage := '-ERR ' + OpCode + ' command invalid now';
Display(FErrorMessage);
raise Pop3Exception.Create(FErrorMessage);
end;
FHeaderPart := TRUE;
FHeaderKeyword := '';
FHeaderData := '';
FHeaderFrom := '';
FHeaderTo := '';
FHeaderSubject := '';
FHeaderReplyTo := '';
FHeaderInReplyTo := '';
FHeaderMessageId := '';
FHeaderReturnPath := '';
FHeaderDate := '';
Cmd := OpCode;
if Params <> '' then
Cmd := Cmd + ' ' + Params;
ExecAsync(RqType, Cmd, NextState, DoneTrans);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.StartMultiLine(
aOnBegin : TNotifyEvent;
aOnLine : TNotifyEvent;
aOnEnd : TNotifyEvent;
aProcess : TNotifyEvent);
begin
FMultiLineLine := aOnLine;
FMultiLineEnd := aOnEnd;
FMultiLineProcess := aProcess;
{ Let the application know that the message is beginning }
if Assigned(aOnBegin) then
aOnBegin(Self);
FNext := GetALine;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomPop3Cli.GetALine;
var
I : Integer;
begin
{ Check if we are still connected }
if not FConnected then begin
FErrorMessage := '-ERR Disconneced unexpectedly';
FRequestResult := 500;
Display(FErrorMessage);
TriggerRequestDone(FRequestResult);
Exit;
end;
{ Check if end of message }
if FLastResponse = '.' then begin
{ Let the application know that the message is finished }
if Assigned(FMultiLineEnd) then
FMultiLineEnd(Self);
FLastResponse := '';
FNext := nil;
TriggerRequestDone(0);
Exit;
end;
{ Check if m
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -