首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

POP3 信箱監控程式實作:WinSock 直連郵件伺服器

     編輯:關於C++

本文示範如何使用 WinSock API 直接實作 POP3 協定,開發信箱監控程式。涵蓋 POP3 命令流程、Socket 通訊封裝、Delphi 程式碼範例與多執行緒監控架構。

POP3 協定核心流程

  1. TCP 連線至 Port 110,接收歡迎訊息(+OK)。
  2. 發送 USER <帳號>,收到 +OK。
  3. 發送 PASS <密碼>,驗證成功回 +OK。
  4. 發送 LIST,取得郵件清單(每行:編號 大小,以 .\r\n 結束)。
  5. 發送 QUIT 結束連線。

關鍵函式實作(Delphi/Pascal)

連線伺服器


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;

POP3 回應判斷


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 定期輪詢實現監控。
  • 多信箱監控:每信箱建立一執行緒獨立輪詢。
  • 無 VCL 介面時,完整程式僅約 60KB。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved