線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1741
推到 Plurk!
推到 Facebook!

POP3信箱監視程式

 
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-04 02:08:41 IP:61.59.xxx.xxx 未訂閱
POP3伺服器程式通常在TCP埠110提供服務。當客戶想要使用服務時,它便與伺服器建立一個TCP連接。一旦連接建立,POP3伺服器就向客戶發送一條歡迎消息。然後客戶開始給伺服器發送命令,伺服器則給出相應的回答。POP3的命令由一個關鍵字或者關鍵字加參數組成。每個命令以回車換行(0xD0xA)作?結束標誌。對於所有的命令,POP3伺服器都會提供一個回答。伺服器的回答由一個狀態標誌加一些附加資訊組成。目前使用的兩個標誌是"+OK"和"-ERR",分別表示客戶的命令是否合法。所有的回答也是以回車換行結束。       與本文討論的話題相關的四個POP3命令是USER、PASS、LIST和QUIT。       USER命令       格式USER name       其中name是用戶在該POP3伺服器上的用戶標識。客戶應該在接到伺服器的歡迎消息後或者在上一個USER或者PASS失敗之後可以發送此命令。       PASS命令       格式PASS string       其中string?該用戶的密碼。客戶在發送了USER命令並且收到了+OK的回答之後方可發送此命令。如果用戶名和密碼都正確,伺服器回答+OK,否則-ERR。       LIST命令       格式LIST       如果該用戶有郵件,則LIST命令會回答+OK,並列出所有郵件的識別字和大小(每個郵件一行),最後一個僅包含一個句點的行(0xD0xA0x2E)表示整個回答的結束。如果該用戶沒有郵件,有些伺服器會返回-ERR,有些在可能返回一個+OK和一個僅包含一個句點的行。當然,客戶必須在PASS命令通過之後客戶程式才能給伺服器發送LIST命令。       QUIT命令       從POP3伺服器上退出登錄。       二、實現相關函數       接下來我們按照POP3協定所定義的通信規則來實現一個名叫POP3CheckMail的函數,只要調用此函數,我們就可以檢測信箱了。       下面的代碼是用與Delphi相容的Pascal語言實現的,我們必須包含WinSock單元,並且在調用下列函數之前初始化好WinSock動態連接庫。初始化WinSock動態連接庫的代碼如下: 
   if WSAStartup($002, wsadata)< > 0 then Halt;        POP3CheckMail的原型如下:        function POP3CheckMail(E-mail,Password:String;var        MailList:TStringList;var ErrorMsg:String):Bool; 
參數說明: E-mail和Password分別?用戶的email信箱名和口令。 變數參數MailList用於返回郵件的標識和大小,MailList.Count表示郵件的封數。 變數參數ErrorMsg返回出錯消息。 以下是POP3CheckMail及其它所用到的函數的實現代碼。 二、相關函數 Connect_Server函數 功能:與指定的主機建立一個TCP連接,返回一個Socket描述符。參數host指定主機的名字,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[1]:=#0; S:=‘'; 
           n:=recv(sockfd,Buf,1,0); 
           while n> 0 do begin 
           buf[1]:=#0; 
           S:=S buf; 
            if (buf[0]=#10) then Break; 
                   n:=recv(sockfd, buf, 1, 0); 
           end; 
           Result:=Trim(S); 
   end; 
四、重要的Pop3函數 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(E-mail,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(E-mail); 
           i:=Pos(‘@',E-mail); 
           User:=Trim(Copy(S,1,i-1)); 
           Host:=Trim(Copy(S,i 1,Length(E-mail)-i)); 
           MailList.Clear; 
           if (user=‘')or(host=‘') then begin 
                        ErrorMsg:=‘Invalid email address.'; 
                   exit; 
            end; 
           if (Host[1]=‘[']and (Host[Length(host)]=‘)') then begin 
                        Host[1]:=‘ ';
                        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; 
   ErrorMsg:String; 
   ...        MailList:=TstringList.Create; 
   POP3CheckMail(‘simon_liu@263.net', ‘ 
   mypassword', MailList, ErrorMsg); 
   If MailList.Count> 0 then 
   MessageBox(0, Pchar(‘You have '  
   IntToStr(MailList.Count)  ‘ new messages!'), ‘New 
   Message!', MB_ICONINFORMATION) 
   Else if ErrorMsg=‘' then MessageBox(0, ‘No message!', ‘',0) 
   Else MessageBox(0, Pchar(ErrorMsg), ‘Error', 0); 
   MailList.Free; 
如果你仔細閱讀了POP3CheckMail函數的實現代碼,你會發現此函數除了可以獲取郵件的封數之外,還可以獲得每一封郵件的大小。你可以通過POP3CheckMail函數的變數參數MailList的Strings陣列來獲取郵件的大小。 實現了POP3CheckMail函數,再在此基礎上編寫一個POP3信箱的監視程式就變得很簡單了。你可以通過一個計時器來定期地調用POP3CheckMail函數,這樣你就可以監視某個email信箱了。假若你想要同時監視多個email信箱,只要?每一個信箱創建一個線程並且在線程中定期調用POP3CheckMail函數即可。你的程式中如果沒有使用Delphi的控制項,那?一個完整的信箱監視程式可能只有60K左右。 --【KTop SNG新聞現場】--記者:ddy----------------------------------------- 請各位市民做好資源回收與垃圾分類,讓不良標題與不當發言在KTop 市消失 -------------------------------------------------------------------------
系統時間:2024-04-19 19:42:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!