PopSock.pas
01.01.2007
unit PopSock; { CrtSocket for Delphi 32 Copyright (C) 1999-2001 Paul Toth <tothpaul@free.fr> http://tothpaul.free.fr This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } interface uses CrtSock,SysUtils; Function OpenMailBox(Server,User,Password:string):integer; Procedure CloseMailBox; Function MailCount:integer; Function GetMail(Index:integer):string; Function MailError:string; implementation var popin,popout:TextFile; last:string; read:boolean; Function MailError:string; begin result:=last; end; Function ReadString:string; begin repeat readln(popin,Result); until (Length(Result)<4)or(Result[4]<>'-'); last:=Result; end; Procedure WriteString(s:string); begin WriteLn(popout,s); end; Function Status:char; var s:string; begin s:=ReadString; if s='' then Status:='?' else Status:=s[1]; end; Function Exec(cmd:string):char; begin Writestring(cmd); Result:=Status; end; Function OpenMailBox(Server,User,Password:string):integer; begin Result:=CallServer(Server,110); if Result>0 then begin AssignCrtSock(Result,popin,popout); if Status='+' then begin if (Exec('USER '+User)='+') and (Exec('PASS '+Password)='+') then exit; Disconnect(Result); Result:=-3; end else begin Disconnect(Result); Result:=-2; end; end; end; Procedure CloseMailBox; begin Exec('QUIT'); CloseFile(popout); end; Function MailCount:integer; var i:integer; begin Result:=-1; if Exec('STAT')<>'+' then exit; i:=pos(' ',Last); if i=0 then exit; while Last[i]=' ' do inc(i); Result:=0; while (i<length(Last))and(Last[i] in ['0'..'9']) do begin Result:=10*Result+ord(Last[i])-ord('0'); inc(i); end; end; Function GetMail(Index:integer):string; var s:string; begin Writeln(popout,'RETR ',Index); result:=''; if Status='+' then begin ReadLn(popin,s); while s<>'' do begin result:=result+s+#13#10; // header ReadLn(popin,s); end; Repeat result:=result+s+#13#10; // body ReadLn(popin,s); until s='.'; end; end; end.