本文示範如何使用 WinSock API 直接實作 POP3 協定,開發信箱監控程式。涵蓋 POP3 命令流程、Socket 通訊封裝、Delphi 程式碼範例與多執行緒監控架構。
+OK)。USER <帳號>,收到 +OK。PASS <密碼>,驗證成功回 +OK。LIST,取得郵件清單(每行:編號 大小,以 .\r\n 結束)。QUIT 結束連線。
function Connect_Server(host: string; Port: integer): integer;
var sin: sockaddr_in; phe: PHostEnt; p: PLongInt; i: integer;
begin
sin.sin_family := AF_INET; sin.sin_port := htons(Port);
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;
Result := socket(PF_INET, SOCK_STREAM, 0);
if Result = INVALID_SOCKET then Exit;
if connect(Result, sin, SizeOf(sin)) = SOCKET_ERROR then begin {錯誤處理} end;
end;
function Write_Socket(sockfd: Integer; const s: string): Integer;
begin Result := WinSock.Send(sockfd, Pointer(s)^, Length(s), 0); end;
function Socket_Readline(sockfd: Integer): String;
var S: String; Buf: array[0..1] of Char; n: Cardinal;
begin
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;
function Pop3Response(Sockfd: Integer): Boolean;
var S: string;
begin
S := Socket_Readline(sockfd);
Result := Copy(S, 1, 3) = '+OK';
end;
function POP3CheckMail(Email, Password: String; var MailList: TStringList; var ErrorMsg: String): Boolean;
var sockfd: Integer; S, Host, User: String;
begin
Result := False; ErrorMsg := '';
// 解析 Email 取得 User/Host
// 連線、USER、PASS、LIST 依序驗證
// 讀取 LIST 回應填入 MailList
// QUIT、關閉 Socket
Result := True;
end;
var MailList: TStringList; ErrorMsg: String;
MailList := TStringList.Create;
if POP3CheckMail('user@domain.com', 'pass', MailList, ErrorMsg) then
if MailList.Count > 0 then ShowMessage('有 ' + IntToStr(MailList.Count) + ' 封新郵件!')
else ShowMessage('無新郵件')
else ShowMessage('錯誤: ' + ErrorMsg);
MailList.Free;
TTimer 定期輪詢實現監控。