{==============================================================================| | Project : Delphree - Synapse | 001.001.001 | |==============================================================================| | Content: POP3 client | |==============================================================================| | The contents of this file are subject to the Mozilla Public License Ver. 1.1 | | (the "License"); you may not use this file except in compliance with the | | License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ | | | | Software distributed under the License is distributed on an "AS IS" basis, | | WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for | | the specific language governing rights and limitations under the License. | |==============================================================================| | The Original Code is Synapse Delphi Library. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)2001. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {$WEAKPACKAGEUNIT ON} unit POP3send; interface uses SysUtils, Classes, blcksock, SynaUtil, SynaCode; const cPop3Protocol = 'pop3'; type TPOP3AuthType = (POP3AuthAll, POP3AuthLogin, POP3AuthAPOP); TPOP3Send = class(TObject) private FSock: TTCPBlockSocket; FTimeout: Integer; FPOP3Host: string; FPOP3Port: string; FResultCode: Integer; FResultString: string; FFullResult: TStringList; FUsername: string; FPassword: string; FStatCount: Integer; FStatSize: Integer; FTimeStamp: string; FAuthType: TPOP3AuthType; function ReadResult(Full: Boolean): Integer; function Connect: Boolean; function AuthLogin: Boolean; function AuthApop: Boolean; public constructor Create; destructor Destroy; override; function Login: Boolean; procedure Logout; function Reset: Boolean; function NoOp: Boolean; function Stat: Boolean; function List(Value: Integer): Boolean; function Retr(Value: Integer): Boolean; function Dele(Value: Integer): Boolean; function Top(Value, Maxlines: Integer): Boolean; function Uidl(Value: Integer): Boolean; published property Timeout: Integer read FTimeout Write FTimeout; property POP3Host: string read FPOP3Host Write FPOP3Host; property POP3Port: string read FPOP3Port Write FPOP3Port; property ResultCode: Integer read FResultCode; property ResultString: string read FResultString; property FullResult: TStringList read FFullResult; property Username: string read FUsername Write FUsername; property Password: string read FPassword Write FPassword; property StatCount: Integer read FStatCount; property StatSize: Integer read FStatSize; property TimeStamp: string read FTimeStamp; property AuthType: TPOP3AuthType read FAuthType Write FAuthType; end; implementation const CRLF = #13#10; constructor TPOP3Send.Create; begin inherited Create; FFullResult := TStringList.Create; FSock := TTCPBlockSocket.Create; FSock.CreateSocket; FTimeout := 300000; FPOP3host := cLocalhost; FPOP3Port := cPop3Protocol; FUsername := ''; FPassword := ''; FStatCount := 0; FStatSize := 0; FAuthType := POP3AuthAll; end; destructor TPOP3Send.Destroy; begin FSock.Free; FullResult.Free; inherited Destroy; end; function TPOP3Send.ReadResult(Full: Boolean): Integer; var s: string; begin Result := 0; FFullResult.Clear; s := FSock.RecvString(FTimeout); if Pos('+OK', s) = 1 then Result := 1; FResultString := s; if Full and (Result = 1) then repeat s := FSock.RecvString(FTimeout); if s = '.' then Break; FFullResult.Add(s); until FSock.LastError <> 0; FResultCode := Result; end; function TPOP3Send.AuthLogin: Boolean; begin Result := False; FSock.SendString('USER ' + FUserName + CRLF); if ReadResult(False) <> 1 then Exit; FSock.SendString('PASS ' + FPassword + CRLF); Result := ReadResult(False) = 1; end; function TPOP3Send.AuthAPOP: Boolean; var s: string; begin s := StrToHex(MD5(FTimeStamp + FPassWord)); FSock.SendString('APOP ' + FUserName + ' ' + s + CRLF); Result := ReadResult(False) = 1; end; function TPOP3Send.Connect: Boolean; begin // Do not call this function! It is calling by LOGIN method! FStatCount := 0; FStatSize := 0; FSock.CloseSocket; FSock.LineBuffer := ''; FSock.CreateSocket; FSock.Connect(POP3Host, POP3Port); Result := FSock.LastError = 0; end; function TPOP3Send.Login: Boolean; var s, s1: string; begin Result := False; FTimeStamp := ''; if not Connect then Exit; if ReadResult(False) <> 1 then Exit; s := SeparateRight(FResultString, '<'); if s <> FResultString then begin s1 := SeparateLeft(s, '>'); if s1 <> s then FTimeStamp := '<' + s1 + '>'; end; Result := False; if (FTimeStamp <> '') and not (FAuthType = POP3AuthLogin) then Result := AuthApop; if not Result and not (FAuthType = POP3AuthAPOP) then Result := AuthLogin; end; procedure TPOP3Send.Logout; begin FSock.SendString('QUIT' + CRLF); ReadResult(False); FSock.CloseSocket; end; function TPOP3Send.Reset: Boolean; begin FSock.SendString('RSET' + CRLF); Result := ReadResult(False) = 1; end; function TPOP3Send.NoOp: Boolean; begin FSock.SendString('NOOP' + CRLF); Result := ReadResult(False) = 1; end; function TPOP3Send.Stat: Boolean; var s: string; begin Result := False; FSock.SendString('STAT' + CRLF); if ReadResult(False) <> 1 then Exit; s := SeparateRight(ResultString, '+OK '); FStatCount := StrToIntDef(SeparateLeft(s, ' '), 0); FStatSize := StrToIntDef(SeparateRight(s, ' '), 0); Result := True; end; function TPOP3Send.List(Value: Integer): Boolean; begin if Value = 0 then FSock.SendString('LIST' + CRLF) else FSock.SendString('LIST ' + IntToStr(Value) + CRLF); Result := ReadResult(Value = 0) = 1; end; function TPOP3Send.Retr(Value: Integer): Boolean; begin FSock.SendString('RETR ' + IntToStr(Value) + CRLF); Result := ReadResult(True) = 1; end; function TPOP3Send.Dele(Value: Integer): Boolean; begin FSock.SendString('DELE ' + IntToStr(Value) + CRLF); Result := ReadResult(False) = 1; end; function TPOP3Send.Top(Value, Maxlines: Integer): Boolean; begin FSock.SendString('TOP ' + IntToStr(Value) + ' ' + IntToStr(Maxlines) + CRLF); Result := ReadResult(True) = 1; end; function TPOP3Send.Uidl(Value: Integer): Boolean; begin if Value = 0 then FSock.SendString('UIDL' + CRLF) else FSock.SendString('UIDL ' + IntToStr(Value) + CRLF); Result := ReadResult(Value = 0) = 1; end; end.