机 的 名字,Port 指 定 端 口 号。
function Connect_Server(host:string;Port:integer):integer;
var i:integer;
p:^LongInt;
phe:pHostEnt;
sin:sockaddr_in;
begin
sin.sin_family:=AF_INET;
sin.sin_port:=htons(Port);
//Get the IP for host, allowing for dotted decimal
phe:=gethostbyname(pchar(host));
if phe<>nil
then begin
p:=Pointer(phe^.h_addr_list^);
sin.sin_addr.s_addr:=p^;
end
else begin
i:=inet_addr(PChar(Host));
if i<> -1 then sin.sin_addr.S_addr:=i
end;
//create a socket
Result:=socket(PF_INET,SOCK_STREAM,0);
if (Result=INVALID_SOCKET) then Exit;
//connect to server
if Connect(Result,sin,sizeof(sin))=SOCKET_ERROR
then begin {Error handling} end;
end;
Write_Socket 函 数
功 能: 向Socket 写 入 一 个 字 符串。
function Write_Socket(sockfd:Integer; const s:string):Integer;
begin
result:=Winsock.Send(sockfd,pointer(s)^,Length(s),0)
end;
Socket_Readline 函 数
功 能: 从Socket 上 读 取 一 行。
function Socket_Readline(sockfd:Integer):String;
//Read until #10
var S:String; buf:array[0..1]of Char;
n:Cardinal;
begin
buf[0]:= #0;buf:= #0; S:=‘'';
n:=recv(sockfd,Buf,1,0);
while n>0 do begin
buf:= #0;
S:=S +buf;
if (buf[0]= #10) then Break;
n:=recv(sockfd, buf, 1, 0);
end;
Result:=Trim(S);
end;
Pop3Response 函 数
功 能: 读 取POP3 服 务 器 的 一 行返 回 信 息, 如 果 是“ +OK” 则 函 数 返 回TURE, 如 果 是“ -ERR” 则 返 回FALSE。
function Pop3Response(Sockfd:Integer):Bool;
var S: string;
begin
S:=socket_readline(sockfd);
if copy(s,1,3)=‘ +OK'' then Result:=True
else {if copy(s,1,4)=‘ -ERR'' then }Result:=False;
end;
POP3CheckMail 函 数
功 能: 检 测 名 字 为email 的 信 箱,如 果 有 新 邮 件, 则 通 过 变 量 参 数MailList 将 每 一 封 邮 件 的 大小 返 回。
function POP3CheckMail
(Email,Password:String;var MailList:
TStringList;var ErrorMsg:String):Bool;
var sockfd,i:integer;
S, Host, User:String;
begin
Result:=False; ErrorMsg:=‘'';
if MailList=nil then Exit;
S:=Trim(Email);
i:=Pos(‘@'',Email);
User:=Trim(Copy(S,1,i -1));
Host:=Trim(Copy(S,i +1,Length(Email) -i));
MailList.Clear;
if (user=‘'')or(host=‘'') then begin
ErrorMsg:=‘Invalid email address.'';exit; end;
if (Host=‘['')and (Host[Length(host)]=‘]'')
then begin Host:=‘ '';Host[Length(host)]:= #0;end;
Host:=Trim(host);
sockfd:=Connect_Server(Host,110);
if not Pop3Response(sockfd)then begin ErrorMsg:=
‘Cannot connect to server'';exit; end;
Write_Socket(sockfd,‘USER '' +User + #13 #10);
IF NOT POP3Response(sockfd) then begin ErrorMsg:=
‘USER failed''; Exit;end;
Write_Socket(sockfd,‘PASS '' +Password + #13 #10);
IF NOT POP3Response(sockfd) then begin ErrorMsg:=
‘PASS failed''; Exit;end;
Write_Socket(sockfd,‘LIST'' #13 #10);
POP3Response(sockfd);
while true do begin
s:=Socket_readline(sockfd);
if s=‘.'' then BREAK;
MailList.Add(S);
end;
Write_Socket(sockfd,‘QUIT'' #13 #10);
Closesocket(sockfd);
Result:=True;
end;
三、 邮 件 的 检 测
下 面 我 们 来 看 一 个 使 用POP3CheckMail 函 数 的 简 单 示 例。
var MailList:TstringList;
ErrorMs