Socket實例1--POP3客戶端程序


 

   下面的代碼實例基於POP3的客戶協議,與郵件服務器連接並取回指定用戶帳號的郵件。
  與郵件服務器交互的命令存在字符串數組POPMessage中,程序通過一個do-while循環依次發送這些命令。
#include<stdio.h> <stdlib.h> <errno.h> <string.h> <netdb.h>
#include<sys/types.h> <netinet/in.h> <sys/socket.h>
#define POP3SERVPORT 110  #define MAXDATASIZE 4096
int main(int argc, char *argv[])
{
    int sockfd;
    char Serv_Host[] = "60.28.205.11";
    struct hostent *host;
    struct sockaddr_in serv_addr;
    char *POPMessage[] = {
        "USER huaying.xie/r/n", //回車換行
        "PASS mypasswd/r/n",
        "STAT/r/n",
        "LIST/r/n",
        "TOP 1/r/n",
        "RETR 1/r/n",
        //"DELE 1/r/n",
        "QUIT/r/n",
        NULL
    };
    int iLength;
    int iMsg = 0;
    //int iEnd = 0;
    char buf[MAXDATASIZE];
    if((host = gethostbyname(Serv_Host)) == NULL){
        perror("gethostbyname error:");
        exit(1);
    }
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
        perror("socket error:");
        exit(1);
    }
    serv_addr.sin_family = PF_INET;
    serv_addr.sin_port = htons(POP3SERVPORT);
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero), 8);
    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1){
        perror("connect error:");
        exit(1);
    }
    do{
        int iEnd = 0;
        send(sockfd, POPMessage[iMsg], strlen(POPMessage[iMsg]), 0);
        printf("have sent: %s", POPMessage[iMsg]);
        //iLength = recv(sockfd, buf+iEnd, sizeof(buf)-iEnd, 0);
        iLength = recv(sockfd, buf, sizeof(buf), 0);
        iEnd += iLength;
        buf[iEnd] = '/0';
        printf("received: %s, %d/n", buf, iMsg);
        iMsg++;
    }while(POPMessage[iMsg]);
    close(sockfd);
    return 0;
}

POP3 命令簡介(網絡整理)
  POP3 (Post Office Protocol 3) 即郵局協議的第 3 個版本,它規定怎樣將個人計算機連接到 Internet 的郵件服務器和下載電子郵件的電子協議。
      它是因特網電子郵件的 第一個離線協議標準, POP3 允許用戶從服務器上把郵件存儲到本地主機(即自己的計算機)上,同時刪除保存在郵件服務器上的郵件,而POP3服務器則是遵循 POP3 協議的接收郵件服務器,用來接收電子郵件的。
  POP3 命令:(不區分大小寫)
    USER username 認證用戶名
    PASS password 認證密碼認證,認證通過則狀態轉換
    APOP name,digest 認可一種安全傳輸口令的辦法,執行成功導致狀態轉換,請參見 RFC 1321 。
    STAT 處理請求 server 回送郵箱統計資料,如郵件數、 郵件總字節數
    UIDL n 處理 server 返回用於該指定郵件的唯一標識, 如果沒有指定,返回所有的。
    LIST n 處理 server 返回指定郵件的大小等
    RETR n 處理 server 返回郵件的全部文本
    DELE n 處理 server 標記刪除,QUIT 命令執行時才真正刪除
    RSET 處理撤消所有的 DELE 命令
    TOP n,m 處理返回 n 號郵件的前 m 行內容,m 必須是自然數
    NOOP 處理 server 返回一個肯定的響應
    QUIT 希望結束會話。如果 server 處於"處理" 狀態,則現在進入"更新"狀態,刪除那些標記成刪除的郵件。如果 server 處於"認可"狀態,則結束會話時 server 不進入"更新"狀態 。

  使用telnet 連接 Mail Server 收信
    telnet 60.28.205.40 110 ---使用 telnet 命令連接服務器 110 端口
      Trying 119.119.119.212... --- 正在連接服務器 110 端口
      Connected to 119.119.119.212. --- 連接服務器 110 端口成功
      +OK Winmail Mail Server POP3 ready
    user username --- 輸入用戶名, username 爲具體的用戶名 如:huaying.xie
      +OK --- 執行命令成功
    pass password --- 輸入用戶密碼,password 爲具體的密碼
      +OK 2 messages --- 密碼認證通過
      (-ERR authorization failed --- 密碼認證失敗)
    stat --- 郵箱狀態
      +OK 2 6415 --- 2 爲該信箱總郵件數,6415 爲總字節數
    list --- 列出每封郵件的字節數
      +OK --- 執行命令成功,開始顯示,左邊爲郵件的序號,右邊爲該郵件的大小
      1 537 --- 第 1 封郵件,大小爲 537 字節
      2 5878 --- 第 2 封郵件,大小爲 5878 字節
      .
    top 1 --- 接收第 1 封郵件
      +OK --- 接收成功, 返回第 1 封郵件頭
      Return-Path: <[email protected]>
      Delivered-To: [email protected]
      Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
      From: [email protected]
      To: [email protected]
      Date: Mon, 25 Oct 2004 14:24:27 +0800
      Subject: test mail
      .
    retr 1 --- 接收第 1 封郵件
      +OK --- 接收成功, 返回第 1 封郵件全部內容
      Return-Path: <[email protected]>
      Delivered-To: [email protected]
      Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
      From: [email protected]
      To: [email protected]
      Date: Mon, 25 Oct 2004 14:24:27 +0800
      Subject: test mail     
      Hi, test2
      This is a test mail, you don't reply it.
      .
    dele 1 --- 刪除第 1 封郵件
      +OK --- 刪除成功
    dele 2 --- 刪除第 2 封郵件
      +OK --- 刪除成功
    quit --- 結束會話
      +OK --- 執行命令成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章