程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中怎樣監視POP3信箱

Delphi中怎樣監視POP3信箱

編輯:Delphi

---- 本 文 將 向 大 家 介 紹 怎 樣 編 寫自 己 的 信 箱 監 視 程 序, 程 序 將 直 接 調 用WinSock 函 數 來 進 行網 絡 通 信。 除 了 具 備WinSock 編 程 知 識 之 外, 還 必 須 了 解POP3 協 議。 下 面 是 對POP3 的 一 個 粗 略 的 介 紹, 讀 者 可 以 參 看RFC 1225 更 為 詳 細 地 了 解 該 協 議。 一、 關 於POP3 協 議 
  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 4 兼 容的Pascal 語 言 實 現 的, 我 們 必 須 包 含WinSock 單 元, 並 且 在 調用 下 列 函 數 之 前 初 始 化 好WinSock 動 態 連 接 庫。 初 始 化WinSock 動 態 連 接 庫 的 代 碼 如 下: 

  if WSAStartup( $002, wsadata)<>0 then Halt; 

  POP3CheckMail 的 原 型 如 下: 

  function POP3CheckMail(Email,PassWord:String;var MailList:TStringList;var ErrorMsg:String):Bool; 

  參 數 說 明: 

  Email 和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 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved