?? mailrcv1.pas
字號(hào):
procedure TPOP3ExcercizerForm.ResetButtonClick(Sender: TObject);
begin
Exec(Pop3Client.RSet, 'Rset');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.TopButtonClick(Sender: TObject);
begin
Exec(Pop3Client.Top, 'Top');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.RpopButtonClick(Sender: TObject);
begin
Exec(Pop3Client.RPop, 'Rpop');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.UidlButtonClick(Sender: TObject);
begin
Exec(Pop3Client.Uidl, 'Uidl');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.ApopButtonClick(Sender: TObject);
begin
Exec(Pop3Client.APop, 'Apop');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ This event handler is called when TPop3Client is about to receive a }
{ message. The MsgNum property gives the message number. }
{ This event handler could be used to open the file used to store the msg. }
{ The file handle could be stored in the TPop3Client.Tag property to be }
{ easily retrieved by the OnMessageLine and OnMessageEnd event handlers. }
procedure TPOP3ExcercizerForm.Pop3ClientMessageBegin(Sender: TObject);
begin
DisplayMemo.Lines.Add('*** Message ' +
IntToStr((Sender as TPop3Cli).MsgNum) +
' begin ***');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ This event handler is called when TPop3Client has detected the end of a }
{ message, even if there is an error or exception, this event gets called. }
{ This event handler could be used to close the file used to store the msg. }
procedure TPOP3ExcercizerForm.Pop3ClientMessageEnd(Sender: TObject);
begin
DisplayMemo.Lines.Add('*** Message ' +
IntToStr((Sender as TPop3Cli).MsgNum) +
' end ***');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ This event handler is called for each message line that TPop3Client is }
{ receiveing. This could be used to write the message lines to a file. }
procedure TPOP3ExcercizerForm.Pop3ClientMessageLine(Sender: TObject);
begin
DisplayMemo.Lines.Add((Sender as TPop3Cli).LastResponse);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ This event handler is called when TPop3Client is about to receive a }
{ list line. The MsgNum property gives the message number. }
procedure TPOP3ExcercizerForm.Pop3ClientListBegin(Sender: TObject);
begin
DisplayMemo.Lines.Add('*** List begin ***');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ This event handler is called when TPop3Client has received the last list }
{ line. }
procedure TPOP3ExcercizerForm.Pop3ClientListEnd(Sender: TObject);
begin
DisplayMemo.Lines.Add('*** List End ***');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ This event handler is called for each list line received by TPop3Client. }
procedure TPOP3ExcercizerForm.Pop3ClientListLine(Sender: TObject);
var
Buffer : String;
begin
Buffer := 'MsgNum = ' + IntToStr((Sender as TPop3Cli).MsgNum) + ' ' +
'MsgSize = ' + IntToStr((Sender as TPop3Cli).MsgSize) + ' ' +
'Line = ''' + (Sender as TPop3Cli).LastResponse + '''';
DisplayMemo.Lines.Add(Buffer);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.Pop3ClientUidlBegin(Sender: TObject);
begin
DisplayMemo.Lines.Add('*** Uidl begin ***');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.Pop3ClientUidlEnd(Sender: TObject);
begin
DisplayMemo.Lines.Add('*** Uidl end ***');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.Pop3ClientUidlLine(Sender: TObject);
var
Buffer : String;
begin
Buffer := 'MsgNum = ' + IntToStr((Sender as TPop3Cli).MsgNum) + ' ' +
'MsgUidl = ' + (Sender as TPop3Cli).MsgUidl + '''';
DisplayMemo.Lines.Add(Buffer);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.MessageBegin(Sender: TObject);
begin
MessageForm.Caption := 'Message ' +
IntToStr((Sender as TPop3Cli).MsgNum);
MessageForm.Show;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.MessageLine(Sender: TObject);
begin
MessageForm.DisplayMemo.Lines.Add((Sender as TPop3Cli).LastResponse);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.NextButtonClick(Sender: TObject);
begin
MessageForm.DisplayMemo.Clear;
MessageForm.Caption := 'Message';
Pop3Client.OnMessageBegin := MessageBegin;
Pop3Client.OnMessageEnd := nil;
Pop3Client.OnMessageLine := MessageLine;
Pop3Client.OnRequestDone := NextMessageRequestDone;
Pop3Client.MsgNum := StrToInt(MsgNumEdit.Text);
Pop3Client.Retr;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.NextMessageRequestDone(
Sender: TObject;
RqType: TPop3Request; Error: Word);
begin
if Error <> 0 then
Exit;
MsgNumEdit.Text := IntToStr(StrToInt(MsgNumEdit.Text) + 1);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.GetAllMessageLine(Sender: TObject);
begin
Writeln(FFile, (Sender as TPop3Cli).LastResponse);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ The procedure here after will start an event chain that will eventually }
{ download all messages for the POP3 server. We cannot simply loop because }
{ the POP3 compomnet is asynchronous: it will not wait for operation done }
{ before returning. We must "chain" operations one after the other using }
{ the OnRequestDone event handler. We use the variable FGetAllState to keep }
{ track of where we are. }
{ To get all messages, we must first call Stat to know how many messages }
{ are on the server, then for each message we call Uidl to get a unique }
{ identifier for each message to build a file name and know if we already }
{ have a message, then we retrieve the message, then we increment the }
{ message number and continue until the number of messages is reached. }
{ We should start a TTimer to handle timeout... }
procedure TPOP3ExcercizerForm.GetAllButtonClick(Sender: TObject);
var
IniFile : TIniFile;
begin
{ Get path from INI file }
IniFile := TIniFile.Create(IniFileName);
FMsgPath := IniFile.ReadString('Data', 'MsgPath',
ExtractFilePath(Application.ExeName));
IniFile.Free;
{ Be sure to have an ending backslash }
if (Length(FMsgPath) > 0) and (FMsgPath[Length(FMsgPath)] <> '\') then
FMsgPath := FMsgPath + '\';
FGetAllState := 0;
FFileOpened := FALSE;
Pop3Client.OnRequestDone := GetAllRequestDone;
Pop3Client.OnMessageBegin := nil;
Pop3Client.OnMessageEnd := nil;
Pop3Client.OnMessageLine := GetAllMessageLine;
Pop3Client.Stat;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ This event handler is called when a request related to GetAll is done. }
{ We check for errors and our state variable FGetAllState which tells us }
{ where we are (stat, uidl or retr which are the 4 commands we use. }
{ Note that we also could use Dele to remove the messages from the server. }
procedure TPOP3ExcercizerForm.GetAllRequestDone(
Sender: TObject;
RqType: TPop3Request; Error: Word);
begin
if Error <> 0 then begin
if FFileOpened then begin
FFileOpened := FALSE;
CloseFile(FFile);
end;
DisplayMemo.Lines.Add('Error ' + Pop3Client.ErrorMessage);
Exit;
end;
try
case FGetAllState of
0: begin { Comes from the Stat command }
if Pop3Client.MsgCount < 1 then begin
DisplayMemo.Lines.Add('No message to download.');
Exit;
end;
Pop3Client.MsgNum := 1; { Start with first message }
FGetAllState := 1;
Pop3Client.Uidl;
end;
1: begin { Comes from the Uidl command }
FFileName := FMsgPath + 'Msg ' + Pop3Client.MsgUidl + '.txt';
if FileExists(FFileName) then begin
DisplayMemo.Lines.Add('Message ' + IntToStr(Pop3Client.MsgNum) + ' already here');
if Pop3Client.MsgNum >= Pop3Client.MsgCount then begin
DisplayMemo.Lines.Add('Finished');
Exit;
end;
Pop3Client.MsgNum := Pop3Client.MsgNum + 1;
FGetAllState := 1;
Pop3Client.Uidl;
end
else begin
DisplayMemo.Lines.Add('Message ' + IntToStr(Pop3Client.MsgNum));
AssignFile(FFile, FFileName);
Rewrite(FFile);
FFileOpened := TRUE;
FGetAllState := 2;
Pop3Client.Retr;
end;
end;
2: begin { Comes from the Retr command }
FFileOpened := FALSE;
CloseFile(FFile);
if Pop3Client.MsgNum >= Pop3Client.MsgCount then begin
DisplayMemo.Lines.Add('Finished');
Exit;
end;
Pop3Client.MsgNum := Pop3Client.MsgNum + 1;
FGetAllState := 1;
Pop3Client.Uidl;
end;
else
DisplayMemo.Lines.Add('Invalid state');
Exit;
end;
except
on E:Exception do begin
if FFileOpened then begin
FFileOpened := FALSE;
CloseFile(FFile);
end;
DisplayMemo.Lines.Add('Error: ' + E.Message);
end;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPOP3ExcercizerForm.Pop3ClientRequestDone(Sender: TObject;
RqType: TPop3Request; Error: Word);
begin
DisplayMemo.Lines.Add('Request Done Rq=' + IntToStr(Integer(RqType)) +
' Error=' + IntToStr(Error));
if RqType = pop3Stat then begin
InfoLabel.Caption := 'Stat ok, ' +
IntToStr(Pop3Client.MsgCount) + ' messages ' +
IntToStr(Pop3Client.MsgSize) + ' bytes'
end
else if RqType = pop3List then begin
InfoLabel.Caption := 'List ok, ' +
IntToStr(Pop3Client.MsgNum) + ' message ' +
IntToStr(Pop3Client.MsgSize) + ' bytes'
end
else if RqType = pop3Last then begin
InfoLabel.Caption := 'Last = ' + IntToStr(Pop3Client.MsgNum);
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
end.
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -