5、电子邮件客户端程序设计与实现
一、設計題目
5、電子郵件客戶端程序設計與實現
二、設計內容
設計一個電子郵件客戶端程序。?
三、設計步驟
3.1原理分析
一個電子郵件系統由三部分組成:用戶代理、郵件服務器,以及郵件發送協議(如SMTP)和郵件接收協議(如POP3)。
3.2編程設計
案例的設計步驟:
數據結構
關鍵代碼
查看郵箱:
sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket對象
const char *host_id = "pop3.126.com";
pHostent = gethostbyname("pop.qq.com");
int port = 110;
addrServer.sin_addr.S_un.S_addr = *((DWORD *) pHostent->h_addr_list[0]); //得到smtp服務器的網絡字節序的ip地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(port); //連接端口110
發送郵箱:
sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket對象
pHostent = gethostbyname("smtp.qq.com");????? //得到有關于域名的信息,鏈接到qq郵箱服務器
addrServer.sin_addr.S_un.S_addr = *((DWORD *) pHostent->h_addr_list[0]); //得到smtp服務器的網絡字節序的ip地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(25);????? //連接端口25
發送base64加密的賬號與授權碼
message = "MTkxMzM5NDg5OQ==\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
message = "cmdhbXdwc3libHdmZ2phag==\r\n";/**/
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
程序流程圖
5,Email
四、調試過程
?? 難點主要是base64加密,不過借助在線解碼編碼工具,得到解決。
五、結果及分析、
查看郵件,程序運行情況: ??????查看結果,已加密:
郵件代理上的結果:
結果一致。
發送郵件,程序運行情況(注:自己發給自己): 郵件代理上:
順利接收應用程序發出的信息。
六、心得體會、
???? 把程序設計運用到實際生活中,讓程序不只是電腦里運行的、鍛煉頭腦的代碼塊,而是可以實實在在作用于現實、帶來新的可能的有力工具。
#include <iostream> #include <string> #include <WinSock2.h> #include <stdio.h> #include <unistd.h>using namespace std; #pragma comment(lib, "ws2_32.lib") /*鏈接ws2_32.lib動態鏈接庫*/int main() {char buff[50000]; //收到recv函數返回的結果string message;string info;string subject;WSADATA wsaData;WORD wVersionRequested = MAKEWORD(2, 1);//WSAStarup,即WSA(Windows SocKNDs Asynchronous,Windows套接字異步)的啟動命令int err = WSAStartup(wVersionRequested, &wsaData);SOCKADDR_IN addrServer; //服務端地址HOSTENT *pHostent;//hostent是host entry的縮寫,該結構記錄主機的信息,包括主機名、別名、地址類型、地址長度和地址列表SOCKET sockClient; //客戶端的套接字/*使用 MAIL 命令指定發送者使用 RCPT 命令指定接收者,可以重復使用RCPT指定多個接收者*/cout << "你想查看郵件還是發郵件?\n\t1.查看郵箱\n\t2.發送郵件\n";int call;cin >> call;if (call == 2){sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket對象pHostent = gethostbyname("smtp.qq.com"); //得到有關于域名的信息,鏈接到qq郵箱服務器addrServer.sin_addr.S_un.S_addr = *((DWORD *) pHostent->h_addr_list[0]); //得到smtp服務器的網絡字節序的ip地址addrServer.sin_family = AF_INET;addrServer.sin_port = htons(25); //連接端口25//int connect (SOCKET s , const struct sockaddr FAR *name , int namelen ); //函數原型err = connect(sockClient, (SOCKADDR *) &addrServer, sizeof(SOCKADDR)); //向服務器發送請求buff[recv(sockClient, buff, 500, 0)] = '\0';/*登錄郵件服務器*/message = "ehlo qq.com\r\n";send(sockClient, message.c_str(), message.length(), 0); //發送ehlo命令buff[recv(sockClient, buff, 500, 0)] = '\0'; //接收返回值// cout <<"1" << buff << endl;message = "auth login\r\n";send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"2" << buff << endl;/*發送base64加密的用戶名、密碼*/message = "MTkxMzM5NDg5OQ==\r\n";send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"3" << buff << endl;message = "cmdhbXdwc3libHdmZ2phag==\r\n";/**/send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"4" << buff << endl;string mail;cout << "請輸入收件人郵箱:";cin >> mail; //925541107@qq.commessage = "MAIL FROM:<1913394899@qq.com> \r\nRCPT TO:<";message.append(mail);message.append("> \r\n");send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';cout <<"5" << buff << endl;buff[recv(sockClient, buff, 500, 0)] = '\0';/*使用 DATA 命令告訴服務器要發送郵件內容*/message = "DATA\r\n";send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"6" << buff << endl;message = "From: 1913394899@qq.com\r\nTo: " + mail + "\r\nsubject:";cout << "主題:";cin >> subject;message.append(subject);message.append("\r\n\r\n");cout << "內容:";cin >> info;message.append(info);message.append("\r\n.\r\n");send(sockClient, message.c_str(), message.length(), 0);// cout <<"7" << buff << endl;message = "QUIT\r\n";send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"8" << buff << endl;cout << "發送成功!" << endl;//system("pause");}if (call == 1){sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket對象const char *host_id = "pop3.126.com";pHostent = gethostbyname("pop.qq.com");int port = 110;addrServer.sin_addr.S_un.S_addr = *((DWORD *) pHostent->h_addr_list[0]); //得到smtp服務器的網絡字節序的ip地址addrServer.sin_family = AF_INET;addrServer.sin_port = htons(port); //連接端口110err = connect(sockClient, (SOCKADDR *) &addrServer, sizeof(SOCKADDR)); //向服務器發送請求buff[recv(sockClient, buff, 500, 0)] = '\0';message = "user 1913394899@qq.com\r\n";send(sockClient, message.c_str(), message.length(), 0); //發送賬號buff[recv(sockClient, buff, 500, 0)] = '\0'; //接收返回值// std::cout << "Client : send name \nServer:"// << buff << std::endl;message = "pass rgamwpsyblwfgjaj\r\n";send(sockClient, message.c_str(), message.length(), 0); //發送授權碼buff[recv(sockClient, buff, 500, 0)] = '\0'; //接收返回值//std::cout << "Client : send pass \nServer:"// << buff << std::endl;message = "stat\r\n";send(sockClient, message.c_str(), message.length(), 0); //發送狀態buff[recv(sockClient, buff, 500, 0)] = '\0'; //接收返回值 // sleep(1);//std::cout << "Client : send stat \nServer : "// << buff << std::endl;message = "list\r\n";send(sockClient, message.c_str(), message.length(), 0); //發送狀態buff[recv(sockClient, buff, 50000, 0)] = '\0'; //接收返回值 // sleep(1);std::cout << "Client : send list \nServer :"<< buff << std::endl;while(1){int n;std::cout << "你先想查看那一封郵件?輸入序號"<< std::endl;cin >> n;message = "retr " + to_string(n) + "\r\n";send(sockClient, message.c_str(), message.length(), 0); //發送狀態 // sleep(1);std::cout << "Client : send retr (...) \n";buff[recv(sockClient, buff, 50000, 0)] = '\0'; //接收返回值std::cout << "Server :" << buff << std::endl;}//下面的while循環有些問題,目前還沒有想到解決方法。以后改正!// while(1)// {/*int num = sock.recv_socket();std::cout << "Server :" << sock.get_recvbuf() << std::endl;*//* if(num <= 0){break;}*/// }/* sock.send_socket("quit\r\n");std::cout << "Client : send quit \nServer :"<< sock.get_recvbuf() << std::endl;}*/} }總結
以上是生活随笔為你收集整理的5、电子邮件客户端程序设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Matlab【可视化作图】绘制线电压相电
- 下一篇: coco2dx精灵和背景遮挡_Cocos