二. 代码实现(以POP3为例) ---- 自定义TPOP类的描述: SessionState = ( Init,Authorization, Transaction,Update); TPop=class (TComponent) public UserName:string;//Email帐户名 PassWord:string; //Email口令 ReceText:Pchar; //server端收到的字符串 PopState:SessionState; //pop状态:init or authorization or transaction or update MsgCount:integer; //邮件总数 SizeCount:integer; //邮件总大小 ReplyString:string;//服务器端发送的应答信息 DeleIndex:byte;//用户要删的邮件序号 ListIndex:byte;//list方法 的参数:用户要列出的序号为listindex的邮件信息 RetrIndex:byte;//retr方法的参数:用户要取序号为retrindex的邮件 TopIndex:byte; //top方法的参数 QuitFlag:boolean;//用户如果通过quit命断连则此变量为true;反之(此时要把f _dele都置回0) OldMsgCount:integer;//旧邮件数:Last 命令返回 //邮件头的各个域 HMsgId:string; HReplyTo:string; HDate:string; HFrom:string; HTo:string; HSubject:string; HMIME_Ver:real; HContent_Type:string; HContent_Transfer_Encoding:string; HText:string; //所有POP3服务器必须支持的命令 procedure user; function pass:boolean; procedure stat; procedure dele; procedure list; procedure retr; procedure noop; procedure rset; procedure aquit; procedure tquit; //扩展的可选择实现的POP3 命令 procedure top; procedure last; procedure apop; procedure uidl; end; ---- 1. 建立连接 ---- 我们可以看到利用了Tclientsocket后客户端请求建立连接只需下面的代码。 with ClientSocket do begin Host := Server; Active := True; end; ---- 服务器端利用TserverSocket,一直在侦听110端口,若客户端有连接请求,则Serv erSocketAccept事件会被激活,建立起连接。 procedure TMyForm.ServerSocketAccept(Sender: TObject; Socket: TCustomWinSoc ket); begin Statusbar1.Panels[0].Text := '连接到 ' + Socket.RemoteAddress; //pop对象初始化 pop:=TPop.Create(nil); pop.PopState:=init; pop.LoginResult:=false; pop.QuitFlag:=false; ServerSocket.Socket.Connections[0].sendtext('+OK ibonc pop3 server is read y'+crlf); end; ---- 2. 通信 ---- 服务器端收到客户端发来的信息,则会激活ServerSocketClientRead事件,通过S erverSocket的Socket.ReceiveText可以得到信息的内容。 procedure TMyForm.ServerSocketClientRead(Sender: TObject; Socket: TCustomWi nSocket); var temp_command :string; //存放接收到的命令行,并做去crlf的处理 begin temp_command:=Socket.ReceiveText; //to remove the crlf in command line temp_command:=trim(copy(temp_command,1,pos(crlf,temp_command)-1)); pop.ReceText:=pchar(temp_command); if pop.popstate=init then if strLIComp(pop.ReceText,'user ',5)=0 then pop.user else ServerSocket.Socket.Connections[0].sendtext('-ERR user name pleas e') else if pop.popstate=authorization then begin if strLIComp(pop.ReceText,'pass ',5)=0 then pop.pass else if strIComp(pop.ReceText,'quit')=0 then pop.aquit else ServerSocket.Socket.Connections[0].sendtext('-ERR pass word p lease'); end else if pop.popstate=transaction then begin if strIComp(pop.ReceText,'stat')=0 then pop.stat else if strLIComp(pop.ReceText,'dele ',5)=0 then pop.dele else if strLIComp(pop.ReceText,'list',4)=0 then pop.list else if strLIComp(pop.ReceText,'retr ',5)=0 then pop.retr else if strIComp(pop.ReceText,'noop')=0 then pop.noop else if strIComp(pop.ReceText,'rset')=0 then pop.rset else if strIComp(pop.ReceText,'quit')=0 then pop.tquit else if strIComp(pop.ReceText,'last')=0 then pop.last else if strLIComp(pop.ReceText, 'apop ',5)=0 then pop.apop else if strLIComp(pop.ReceText, 'uidl ',5)=0 then pop.uidl else ServerSocket.socket.connections[0].sendtext('-ERR no such comm and yet'+crlf); end end; ---- 3. 关闭连接 procedure TMyForm.ServerSocketClientDisconnect(Sender: TObject;Socket: TC ustomWinSocket); begin ServerSocket.Active := False; //如果client端没有通过quit 命令断连, 则在断连时要把那些f_dele置为0 if pop.QuitFlag=False then begin MyForm.query11.Close; MyForm.query11.Params[0].Asstring:=pop.UserName; MyForm.query11.prepare; MyForm.query11.execsql; end; end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货