下面的代碼實例基於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 --- 執行命令成功
Socket實例1--POP3客戶端程序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.